什么&#34; id <sometype> variableName&#34;表示Objective-C </sometype>

时间:2013-05-11 20:25:44

标签: objective-c cocoa-touch

我正在编写一些Cocoa教程并遇到了这种语法并且不知道它意味着什么。从上下文我假设您为变量设置了强类型。

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

我发现通过删除<someType>语法仍允许我发送[sectionInfo name]消息。很明显,无论如何,编译器都会识别id中的对象仍然是正确的类型。

Link to tutorial.

2 个答案:

答案 0 :(得分:3)

这意味着variableName可以是任何类,但必须实现someType协议

答案 1 :(得分:3)

id sectionInfo;

这意味着sectionInfo是任何类的实例。它将在没有警告的情况下响应编译器可见的任何方法(这就是为什么要避免使用id类型的原因)。

id <NSFetchedResultsSectionInfo> sectionInfo;

这声明sectionInfo仅对NSFetchedResultsSectionInfo协议中声明的方法作出响应(可能 - 有些可能是@optional)。正如您所发现的那样,尝试调用任何其他方法都会产生警告。

更好的声明将是:

MySpecificClass<NSFetchedResultsSectionInfo> *sectionInfo;

这声明sectionInfo实现了协议NSFetchedResultsSectionInfo ,而MySpecificClass(或子类)的实例。编译器将允许任何特定于该类(或超类)的方法调用 NSFetchedResultsSectionInfo协议中的任何方法。