0

私はいくつかの Cocoa チュートリアルに取り組んでおり、この構文に出くわしましたが、それが何を意味するのかわかりません。文脈から、変数に強い型を設定していると思います。

    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo name];

<someType>構文を削除しても、[sectionInfo name]メッセージを送信できることがわかりました。したがって、明らかにコンパイラは、id のオブジェクトが依然として適切な型であることを認識しています。

チュートリアルへのリンク。

4

2 に答える 2

3
id sectionInfo;

これはsectionInfo、任意のクラスのインスタンスであることを意味します。コンパイラに見える場所で宣言されたメソッドには、警告なしで応答します (これが、裸のid型を避けるべき理由です)。

id <NSFetchedResultsSectionInfo> sectionInfo;

これは、 protocolsectionInfoで宣言されたメソッドにのみ応答することを宣言します (おそらく -- 一部は @optional である可能性があります)NSFetchedResultsSectionInfo。あなたが発見したように、他のメソッドを呼び出そうとすると警告が生成されます。

より良い宣言は次のようになります。

MySpecificClass<NSFetchedResultsSectionInfo> *sectionInfo;

sectionInfoこれは、 がプロトコルを実装し、NSFetchedResultsSectionInfo (MySpecificClassまたはサブクラス)のインスタンスであることを宣言します。コンパイラは、そのクラス (またはスーパークラス)に固有のすべてのメソッド呼び出しと、NSFetchedResultsSectionInfoプロトコル内のすべてのメソッドを許可します。

于 2013-05-12T00:12:34.663 に答える
3

variableName はどの種類のクラスでもかまいませんが、 someType プロトコルを実装する必要があることを意味します

于 2013-05-11T20:27:26.990 に答える