尽管问题很广泛但我最近对使用Realm library时播种的一个案例感到好奇。正如我以前在很多场合使用协议(委托)以及使用<>导入的类。现在,如果我误解的话,这就是我完全不了解或根本不理解的代码:
@property (nonatomic, strong) RLMArray <ExerciseLog *><ExerciseLog> * exerciseLogs;
我认为行<ExerciseLog> * exerciseLogs
的第二部分用于确保exerciseLogs可以是符合ExerciseLog协议的任何ExerciseLog的实例,我的假设是正确的吗?
或者简单地说,如果用户发送了与预期的对象不同的对象,则应用程序不会崩溃,并且将分配默认值。
这个部分我猜测,是某种安全的转换,以便返回的对象确认到ExerciseLog。
答案 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#中,这只能通过实际声明所述类来实现。