请帮助协议代码没有意义

时间:2015-06-16 16:52:43

标签: ios objective-c cocoa

我对这句话的一部分感到难过:

@property(nonatomic, readonly) NSArray <id<NSFetchedResultsSectionInfo>>*sections

此属性属于NSFetchedResultsController类。 虽然NSFetchedResultsSectionInfo是一种协议,但id<NSFetchedResultsSectionInfo>是一种必须符合NSFetchedResultsSectionInfo协议的对象类型。 id<NSFetchedResultsSectionInfo>不是一个协议,所以将它们括在尖括号中 <id<NSFetchedResultsSectionInfo>>毫无意义。 声明NSArray <id<NSFetchedResultsSectionInfo>>对我没有意义,因为如何使对象类型id成为NSArray类的协议。有人可以对此有所了解吗?感谢。

1 个答案:

答案 0 :(得分:1)

该语法实际上并不意味着该数组符合任何协议。这种表示法具有误导性。它只告诉您 in 数组中的值id并且符合NSFetchedResultsSectionInfo协议。

documentation州:

  

sections数组中的对象实现了NSFetchedResultsSectionInfo协议。

您可以确保它只包含指定类型的值,并且编译器会告诉您,如果您这样做,则会尝试插入不兼容的对象。

您可能需要查看此apple doc的最后一部分。

  

例如,如果您正在编写使用Core Data框架的iOS应用程序,则可能会遇到NSFetchedResultsController类。此类旨在帮助数据源对象将存储的数据提供给iOS UITableView,从而可以轻松提供行数等信息。

     

如果您正在使用其内容分为多个部分的表视图,您还可以向提取的结果控制器询问相关的部分信息。 NSFetchedResultsController类不是返回包含此节信息的特定类,而是返回一个匿名对象,该对象符合NSFetchedResultsSectionInfo协议。这意味着仍然可以在对象中查询所需的信息,例如节中的行数

     

即使您不知道sectionInfo对象的类,NSFetchedResultsSectionInfo协议也要求它可以响应numberOfObjects消息。