Realm的documentation on optional properties州:
可以使用标准Swift语法将
String
,NSDate
和NSData
属性声明为可选属性或非可选属性。使用RealmOptional
声明可选的数字类型。
为什么数字类型使用非标准RealmOptional
而不是Swift的内置可选语法?
答案 0 :(得分:12)
Realm模型类自动为访问底层数据库数据的持久属性实现getter和setter。为了提供这些getter和setter,必须使用dynamic
修饰符声明属性。此修饰符要求Swift通过getter和setter动态调度对属性的访问,而不是在编译时直接访问该成员。 dynamic
修饰符具有显着的限制:仅支持可在Objective-C中表示的类型。这是因为Swift的动态调度建立在Objective-C运行时之上。正是这种限制阻止了Realm直接支持Int?
。
考虑到此限制,您可能想知道String?
,NSData?
和NSDate?
是如何得到支持的。答案是它们在Objective-C中具有自然等价物,即nullable NSString *
,nullable NSData *
和nullable NSDate *
。 Swift的数字类型不存在这样的等价物。