2016-03-07 47 views
2

尽管问题相当广泛,但我对使用Realm library时最近播种的一个病例感到好奇。正如我之前在很多场合使用过的协议(委托),还使用了<>导入的类。而现在这行代码中,我完全不了解或根本不都明白,如果我误以为:Objective-C中尖括号的含义?

@property (nonatomic, strong) RLMArray <ExerciseLog *><ExerciseLog> * exerciseLogs; 

我想这行<ExerciseLog> * exerciseLogs的第二部分是用来确保exerciseLogs可能是任何符合ExerciseLog协议的ExerciseLog的实例,我的假设是否正确?

或简单地说如果用户发送不同的对象,然后预期的,应用程序不会崩溃,并且将分配一个默认值。

这个部分我猜测,这是某种安全铸造,以便返回的对象确认为ExerciseLog。

回答

1

类接口定义中的尖括号表示您的类符合的协议。

协议几乎就像Java或C#中的接口一样,另外Objective-C协议中的方法可以是可选的。

另外在Objective-C中,您还可以声明变量,参数或实例变量以符合多种协议。示例

NSObject * myVariable; 在这种情况下,该类必须是NSObject或一个子类(只有NSProxy及其子类会失败),并且它还必须符合NSCoding和UITableViewDelegate协议。

在Java或C#中,这只能通过实际声明所述类来实现。

2

Obj-C协议一致性和泛型的组合。 RLMArray被宣告为

@interface RLMArray < RLMObjectType : RLMObject * > : NSObject<RLMCollection,NSFastEnumeration> 

它有一个泛型参数。这是<ExerciseLog *>

第二部分<ExerciseLog>符合给定类型的协议。

顺便说一句,该协议是用RLM_ARRAY_TYPE宏声明的。代码似乎有点复杂,但它可能是一种较早的方式来强制数组的元素类型(RLMArray<protocolX>不可分配给RLMArray<protocolY>)。

引用的文档:

不同于一个NSArray,RLMArrays保持单个类型,由objectClassName属性指定。这在这些文档中被称为数组的“类型”。

当声明一个RLMArray属性时,必须将该类型标记为符合协议,其名称应与其包含的对象相同(请参阅RLM_ARRAY_TYPE宏)。 RLMArray属性也可以使用Objective-C泛型(如果可用)。例如: