为什么 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 的数字类型不存在此类等价物。