领域中的可选 Int

Posted

技术标签:

【中文标题】领域中的可选 Int【英文标题】:Optional Int in Realm 【发布时间】:2016-01-26 04:19:16 【问题描述】:

我正在尝试在 Realm 中使用 Optional Int 并且我认为遇到了一个旧错误。

代码

dynamic var reps: Int? = nil

错误

'Property cannot be marked dynamic because its type cannot be represented in Objective-C'

我正在使用 Realm 0.96.1 和 XCode 7.1

我了解在 Realm 文档中它说 Int 不支持作为 Optional 但 https://twitter.com/realm/status/656621989583548416。那是来自Realm twitter,所以这就是我感到困惑的原因。 Optional Int 支持还是不支持?

【问题讨论】:

你更新 Realm 了吗?另外,你在使用 Cocoapods 吗?你确定你使用的是 0.96.1 吗? 是的,我正在使用 CocoaPods。 Realm 0.96.1 和 RealmSwift 0.96.1 尝试使用 Int16、32 或 64。我正在查看文档,它说它们仅支持 0.96.1 中的那些。你使用的是 Swift 2.0 分支,对吧? 查看***.com/questions/33358224/… 了解为什么Int? 不起作用 【参考方案1】:

来自 Realm 文档:

StringNSDateNSData 属性可以使用标准 Swift 语法声明为可选或非可选。

使用RealmOptional声明可选的数字类型:

class Person: Object 
    // Optional string property, defaulting to nil
    dynamic var name: String? = nil

    // Optional int property, defaulting to nil
    // RealmOptional properties should always be declared with `let`,
    // as assigning to them directly will not work as desired
    let age = RealmOptional<Int>()


let realm = try! Realm()
try! realm.write() 
    var person = realm.create(Person.self, value: ["Jane", 27])
    // Reading from or modifying a `RealmOptional` is done via the `value` property
    person.age.value = 28

RealmOptional 支持IntFloatDoubleBool,以及IntInt8Int16Int32、@987654)的所有大小版本.

更新:

Realm 在Tweet 中提到的可选整数只是针对RealmOptional 使用Int 的大小版本实现可选数值的方式的错误修复

According 对于来自 Realm 的人来说,如果你想在 Realm 对象中有可选的数值,你仍然必须使用 RealmOptional。您不能像其他 Optional 类型一样简单地使用它。

所以dynamic var reps: Int? 将不起作用。

【讨论】:

我在文档中看到我认为 0.96.1 Int 也受支持。我认为这些文档适用于 0.96 我刚刚更新到 RealmSwift 0.96.2,当您尝试将 Int 定义为 Optional 时,它仍然收到您描述的相同错误消息。在 0.96.1 的发行说明中,它说“在 Swift 中使用可选的 Int16/Int32/Int64 属性时修复崩溃。”。他们只称其为错误修复,而不是新功能。恕我直言,添加“真实”可选 Int 将是一项新功能。所以我猜你还是得用RealmOptional 我刚刚得到了 Realm 人员的确认,'RealmOptional` 仍然必须用于可选数字类型:twitter.com/realm/status/658795663254253568 有没有人解释一下为什么 Realm 必须引入自己的类型而无法插入原始的选项? 你为什么声明为 let?你如何改变它的价值?【参考方案2】:

在目标c的情况下,我们可以像这样使用可选

Optional numbers can be stored using an NSNumber * property which is tagged with the type of the number.

You can use NSNumber <RLMInt> *, NSNumber<RLMBool> *, NSNumber<RLMFloat> *, and NSNumber<RLMDouble> *.

请参考示例代码

@interface OptionalTypes : RLMObject
@property NSString *optionalString;
@property NSString *requiredString;
@property NSData *optionalData;
@property NSDate *optionalDate;
@property NSNumber<RLMInt> *optionalInt;
@property NSNumber<RLMBool> *optionalBool;
@property NSNumber<RLMFloat> *optionalFloat;
@property NSNumber<RLMDouble> *optionalDouble;
@end
@implementation OptionalTypes
+ (NSArray *)requiredProperties 
    return @[@"requiredString"];

@end

有关更多信息,您还可以查看此链接: https://realm.io/blog/realm-objc-swift-0-96-0/

【讨论】:

以上是关于领域中的可选 Int的主要内容,如果未能解决你的问题,请参考以下文章

proto 3 中的可选(重复)字段

DDD实战8_1 实现对领域中连接字符串的可配置

黄萱菁:自然语言处理中的可理解分析

可选类中的可选属性 VS 可选字典中的可选值

具有 NSData 变量的领域对象,在展开可选值时意外发现 nil

Java 中的可选 orElse 可选