-1

1>これを行わずにプロトコルを使用/利用/消費する他の方法はありますか@interface MyClass : NSObject <SomeProtocol>

2>これを行わなくても、クラスは委任クラスの委任になることができますか@interface MyClass : NSObject <SomeProtocol>

3>私はこれらに関して正しいですか

id<aProtocol> *myVar1;これはmyVar1、任意のクラスのオブジェクトを保持することを意味しますが、そのクラスは実装する必要があります<aProtocol>か?

AClass<bProtocol> *myVar2;これはmyVar2、のオブジェクトを保持し、AClassそれも実装する必要があることを意味し<bProtocol>ますか?

4>これが何をしてい(MyClass <someProtocol> *)[[MyClass alloc] init];MyClass、そのインターフェースで継承していません<someProtocol>

4

2 に答える 2

2
  1. はい、オブジェクトがプロトコルの必要なインターフェイスを実装している限り、そのオブジェクトは基本的に、プロトコルに明示的に準拠するオブジェクトの代わりになります。これを行うと、コンパイラが失われ、必要なメソッドを実装していることを確認するのに役立ちます。したがって、通常は、明示的にして、クラスがプロトコルに準拠していることを宣言するのが最善です。

    私が言うとき、私as long as an object implements the required interface of the protocolは、オブジェクトが必要なメソッドを実装するという意味で非公式に準拠しているが、準拠しようとしていることを明示的にしていないことを意味します。UITableViewDataSourceたとえば、このオブジェクトはメソッドを実装するので有効ですが、@requiredそのように宣言するだけではありません。

    @interface MyObject : NSObject
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    @end
    

    繰り返しますが、これらの関係を明確にして、実際に準拠していると言う必要があります@interface MyObject : NSObject <UITableViewDataSource>

  2. a)id<aProtocol> *myVar1;アスタリスクなしで書く必要があり、これは、に準拠する必要id<aProtocol> myVar1;があると呼ばれる変数があることを示しています-これは嘘である可能性があります(3の回答を参照)b)これは、強すぎることを除いて正しいです、これは次のことを言っていますと呼ばれる変数があり、それが準拠している必要があります-これも嘘である可能性があります(3の回答を参照)myVar1aProtocol
    it must also implement <bProtocol>myVar2bProtocol

  3. ここでは、メソッドの戻り型からのキャストを実行していmyClassますmyClass<someProtocol>。これは基本的に、コンパイラに「オブジェクトが型のオブジェクトを返すことは知っていますが、myClass実際にはそうなると言っていますmyClass<someProtocol>」と言っているのです。基本的に、myClassが定義されていない場合は@interface myClass : NSObject <someProtocol>、コンパイラに嘘をついており、コンパイラが通知できないバグが発生する可能性があります。

コンパイラを沈黙させるために物事をキャストすることに注意する必要があります(コンパイラは非常に賢いです)。たとえば、このコードは問題なくコンパイルできますが、実行時にクラッシュします

UIView *view = (id)@"Hey I'm not a view";
view.frame = CGRectZero;
于 2013-02-14T11:39:51.163 に答える
0

Paul.sの答えを補足するために、クライアントコードで採用する必要のない「非公式プロトコル」の概念もあります(非公式プロトコルは実際にはNSObjectのカテゴリであり、プロトコルではないため)。この概念は、プロトコルの「オプションの」メソッドの概念に大幅に取って代わられました(プロトコルは、オプションで実装できるメソッドを宣言できますmyClass)。

詳細については、 iOSプロトコルのドキュメントを参照してください。

于 2013-02-14T12:05:32.017 に答える