我对这句话的一部分感到难过:
@property(nonatomic, readonly) NSArray <id<NSFetchedResultsSectionInfo>>*sections
此属性属于NSFetchedResultsController类。
虽然NSFetchedResultsSectionInfo是一种协议,但id<NSFetchedResultsSectionInfo>
是一种必须符合NSFetchedResultsSectionInfo协议的对象类型。 id<NSFetchedResultsSectionInfo>
不是一个协议,所以将它们括在尖括号中
<id<NSFetchedResultsSectionInfo>>
毫无意义。
声明NSArray <id<NSFetchedResultsSectionInfo>>
对我没有意义,因为如何使对象类型id成为NSArray类的协议。有人可以对此有所了解吗?感谢。
答案 0 :(得分:1)
该语法实际上并不意味着该数组符合任何协议。这种表示法具有误导性。它只告诉您 in 数组中的值id
并且符合NSFetchedResultsSectionInfo
协议。
sections数组中的对象实现了NSFetchedResultsSectionInfo协议。
您可以确保它只包含指定类型的值,并且编译器会告诉您,如果您这样做,则会尝试插入不兼容的对象。
您可能需要查看此apple doc的最后一部分。
例如,如果您正在编写使用Core Data框架的iOS应用程序,则可能会遇到NSFetchedResultsController类。此类旨在帮助数据源对象将存储的数据提供给iOS UITableView,从而可以轻松提供行数等信息。
如果您正在使用其内容分为多个部分的表视图,您还可以向提取的结果控制器询问相关的部分信息。 NSFetchedResultsController类不是返回包含此节信息的特定类,而是返回一个匿名对象,该对象符合NSFetchedResultsSectionInfo协议。这意味着仍然可以在对象中查询所需的信息,例如节中的行数
即使您不知道sectionInfo对象的类,NSFetchedResultsSectionInfo协议也要求它可以响应numberOfObjects消息。