Objective-C中尖括号的含义是什么?

时间:2016-03-07 18:23:54

标签: ios objective-c

尽管问题很广泛但我最近对使用Realm library时播种的一个案例感到好奇。正如我以前在很多场合使用协议(委托)以及使用<>导入的类。现在,如果我误解的话,这就是我完全不了解或根本不理解的代码:

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

我认为行<ExerciseLog> * exerciseLogs的第二部分用于确保exerciseLogs可以是符合ExerciseLog协议的任何ExerciseLog的实例,我的假设是正确的吗?

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

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

2 个答案:

答案 0 :(得分: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泛型(如果可用)。例如:

答案 1 :(得分:1)

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

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

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

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

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