为什么 Realm 使用 RealmOptional<Int> 而不是 Int?对于可选属性?
Why does Realm use RealmOptional<Int> rather than Int? for optional properties?
Realm 的 documentation on optional properties 状态:
String
, NSDate
, and NSData
properties can be declared as optional or non-optional using the standard Swift syntax. Optional numeric types are declared using RealmOptional
.
为什么数字类型使用非标准 RealmOptional
而不是 Swift 的内置可选语法?
领域模型 类 自动为访问底层数据库数据的持久属性实现 getter 和 setter。为了提供这些 getter 和 setter,您的属性必须使用 dynamic
修饰符声明。此修饰符要求 Swift 通过 getter 和 setter 动态分配对属性的访问,而不是在编译时直接访问成员。 dynamic
修饰符有一个重要的限制:它只支持可以在 Objective-C 中表示的类型。这是因为 Swift 的动态调度是建立在 Objective-C 运行时之上的。正是这个限制使得 Int?
无法被 Realm 直接支持。
您可能想知道如何在这种限制下支持 String?
、NSData?
和 NSDate?
。答案是它们在 Objective-C 中有自然等价物,即 nullable NSString *
、nullable NSData *
和 nullable NSDate *
。 Swift 的数字类型不存在此类等价物。
Realm 的 documentation on optional properties 状态:
String
,NSDate
, andNSData
properties can be declared as optional or non-optional using the standard Swift syntax. Optional numeric types are declared usingRealmOptional
.
为什么数字类型使用非标准 RealmOptional
而不是 Swift 的内置可选语法?
领域模型 类 自动为访问底层数据库数据的持久属性实现 getter 和 setter。为了提供这些 getter 和 setter,您的属性必须使用 dynamic
修饰符声明。此修饰符要求 Swift 通过 getter 和 setter 动态分配对属性的访问,而不是在编译时直接访问成员。 dynamic
修饰符有一个重要的限制:它只支持可以在 Objective-C 中表示的类型。这是因为 Swift 的动态调度是建立在 Objective-C 运行时之上的。正是这个限制使得 Int?
无法被 Realm 直接支持。
您可能想知道如何在这种限制下支持 String?
、NSData?
和 NSDate?
。答案是它们在 Objective-C 中有自然等价物,即 nullable NSString *
、nullable NSData *
和 nullable NSDate *
。 Swift 的数字类型不存在此类等价物。