我正在编写一些Cocoa教程并遇到了这种语法并且不知道它意味着什么。从上下文我假设您为变量设置了强类型。
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo name];
我发现通过删除<someType>
语法仍允许我发送[sectionInfo name]
消息。很明显,无论如何,编译器都会识别id中的对象仍然是正确的类型。
答案 0 :(得分:3)
这意味着variableName可以是任何类,但必须实现someType协议
答案 1 :(得分:3)
id sectionInfo;
这意味着sectionInfo
是任何类的实例。它将在没有警告的情况下响应编译器可见的任何方法(这就是为什么要避免使用id
类型的原因)。
id <NSFetchedResultsSectionInfo> sectionInfo;
这声明sectionInfo
将仅对NSFetchedResultsSectionInfo
协议中声明的方法作出响应(可能 - 有些可能是@optional)。正如您所发现的那样,尝试调用任何其他方法都会产生警告。
更好的声明将是:
MySpecificClass<NSFetchedResultsSectionInfo> *sectionInfo;
这声明sectionInfo
实现了协议NSFetchedResultsSectionInfo
,而是MySpecificClass
(或子类)的实例。编译器将允许任何特定于该类(或超类)的方法调用和 NSFetchedResultsSectionInfo
协议中的任何方法。