我对OBJ-C中的协议有一些疑问。 我经常看到用协议声明id对象的行,例如:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> secInfo = [[self.fetchedResultsController sections]objectAtIndex:section];
NSLog(@"%i",[secInfo numberOfObjects]);
return [secInfo numberOfObjects];
}
我根本不理解以下几行:
id <NSFetchedResultsSectionInfo> secInfo = [[self.fetchedResultsController sections]objectAtIndex:section];
我正在尝试使用CoreData,但如果不理解这一点,我实际上无法继续。 谢谢。
答案 0 :(得分:3)
id <ProtocolName>
是什么意思?
它表示“指向该类实现ProtocolName
协议的任何Objective-C对象的指针”。
objectAtIndex:section
返回什么对象?
它返回符合<NSFetchedResultsSectionInfo>
协议的任何类的对象。
为什么我可以在对象上调用
[secInfo numberOfObjects]
?
为什么不呢?
我的意思是,方法
numberOfObjects
是如何存在的?
返回的对象的类实现它。
答案 1 :(得分:2)
如果您有Java背景,请将NSFetchedResultsSectionInfo
视为Java接口而不是具体类,并且函数内容如下所示:
NSFetchedResultsSectionInfo secInfo = this.fetchedResultsController.sections().objectAtIndex(section);
System.out.println(secInfo.numberOfObjects());
return secInfo.numberOfObjects();
可以在numberOfObjects
上调用 id <NSFetchedResultsSectionInfo> secInfo
,因为这是在Objective-C中声明此类事物的等效方式 - 它不是特定的类,而是“接口”。
答案 2 :(得分:1)
id
表示“任何类型的对象”。 id <NSFetchedResultsSectionInfo>
表示“任何类型的对象,只要它实现NSFetchedResultsSectionInfo
协议。协议只是方法签名列表,如果对象实现协议,则意味着具有实现该协议的所有必需方法。
你真的不在乎。它可以是任何实现NSFetchedResultsSectionInfo
协议的对象,但您并不关心它是什么类型的对象。您需要知道的是,您可以通过NSFetchedResultsSectionInfo
协议向其发送任何所需的消息。
secInfo
是实现NSFetchedResultsSectionInfo
协议的对象。如果你去查看协议(cmd +点击相同会将你带到它的定义),你会看到列表中有一条名为numberOfObjects
的消息。这意味着可以保证实现此协议的任何对象都已实现numberOfObjects
。
答案 3 :(得分:1)
id
是指向任何Objective-C对象的指针的泛型类型。声明类型为id
的变量意味着它可以引用任何对象;声明类型id <SomeProtocol>
的变量意味着它可以引用任何类的对象,但它必须符合SomeProtocol
。
[self.fetchedResultsController sections]
返回一个数组,其中每个元素都是一个对象(其类未知),它实现了NSFetchedResultsSectionInfo
协议并表示了表中的一个部分。您正在实现的方法想知道索引作为section
参数传入的节中的行数,因此您在该数组上调用objectAtIndex:section
以获取id <NSFetchedResultsSectionInfo>
对象代表该部分。
您可以调用[secInfo numberOfObjects]
,因为您已声明secInfo
引用实现NSFetchedResultsSectionInfo
协议的对象; numberOfObjects
是该协议中的一种方法。 (它实际上是有效的,因为在运行时,它实际上是一个实现该协议的对象,正如-[NSFetchedResultsController sections]
记录的行为所预期的那样。)
我正在尝试使用CoreData,但如果不理解这一点,我实际上无法继续。
协议不仅仅是核心数据的东西;如果你遇到问题我建议你阅读Objective-C language documentation。
答案 4 :(得分:0)
“id”是什么意思?
id<NSFetchedResultsSectionInfo>
用于保证对象符合NSFetchedResultsSectionInfo,因此如果不符合,则会收到编译器警告。它对此很有用。
“objectAtIndex:section”返回什么对象?
id
是指向对象的所有指针的根。
当不确定返回的对象是否为某种类型时,通常会使用id
。唯一已知的是它符合NSFetchedResultsSectionInfo协议。所以情况就是这样:你不知道将返回哪种类型的对象,只是它符合该协议。
为什么我可以在对象上调用“[secInfo numberOfObjects]”?我的意思是,方法numberOfObjects是如何存在的?
只需查看文档,它就是由班级实现的。