2015-06-16 26 views
2

我与这句话的一部分难倒:请帮忙协议代码,没有任何意义

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

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

回答

1

该语法实际上并不意味着该数组符合任何协议。该符号具有误导性。它只告诉你里面的这个数组是id并且符合NSFetchedResultsSectionInfo协议。

documentation状态:

区段阵列中的对象实现了NSFetchedResultsSectionInfo协议。

确保它只包含指定类型的值,并且编译器会告诉您如果您尝试插入不兼容的对象,这是为了让编译器知道。

你可能想看看这apple doc的最后一节。

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

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

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

+0

感谢您的解释。我非常感谢。我认为NSArray > *部分是我错过了一些新的语法。另一方面,为什么苹果将@property(nonatomic,只读)NSArray > *部分作为属性声明。它给人的印象是这确实是协议中的实际财产声明。 –

+0

只需在协议声明@property(nonatomic,readonly)NSArray *节中指明并且只是解释NSArray的对象是id类型的NSFetchedResultsSectionInfo>就不会更清楚了。将所有内容放在一行中都会给人以实际声明的印象。 –

+0

有趣。从来没有遇到过这个。 – cacau