0

我正在研究一些 Cocoa 教程并遇到了这种语法,但不知道它是什么意思。从上下文来看,我假设您正在为变量设置强类型。

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

我发现通过删除<someType>语法仍然允许我发送[sectionInfo name]消息。所以很明显,编译器识别出 id 处的对象仍然是正确的类型。

链接到教程。

4

2 回答 2

3

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

于 2013-05-11T20:27:26.990 回答
3
id sectionInfo;

这意味着它sectionInfo是任何类的实例。它会对在编译器可见的任何地方声明的任何方法做出响应而不发出警告(这就是id要避免使用裸类型的原因)。

id <NSFetchedResultsSectionInfo> sectionInfo;

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

更好的声明是这样的:

MySpecificClass<NSFetchedResultsSectionInfo> *sectionInfo;

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

于 2013-05-12T00:12:34.663 回答