Realm 中的可选 Int

问题描述 投票:0回答:3

我正在尝试在 Realm 中使用可选 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
支持还是仍然不支持?

swift int swift2 realm option-type
3个回答
51
投票

来自 Realm 文档:

String
NSDate
NSData
属性可以使用标准 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
支持
Int
Float
Double
Bool
,以及所有大小的版本
Int
Int8
Int16
Int32
Int64
)。

更新: Realm 在

Tweet

中提到的可选整数只是关于使用 RealmOptional

 大小版本实现可选数值的 
Int
 方式的错误修复

根据 Realm 的人的说法,如果你想在 Realm 对象中拥有可选数值,你仍然必须使用

RealmOptional。您不能像其他可选类型一样简单地使用它。

所以
dynamic var reps: Int?

不起作用。


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

1
投票
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/

从 Realm 10.10.0 (2021-07-07) 开始,您应该使用 @Persisted 来声明您的 Realm 属性。它支持可选的 int 等等。

© www.soinside.com 2019 - 2024. All rights reserved.