如何将nil分配给RealmOptional <int>

时间:2018-12-04 11:21:40

标签: ios swift realm

我有类似这样的模型类,并且不知道如何为RealmOptional分配快速的可选值,这迫使我解开可选的值。为什么在分配给RealmOptional之前,我需要打开可选的包装。

将快速可选内容分配给RealmOptional的最佳选择是什么。

import Foundation
import RealmSwift

class Menu:Object {

    var id = RealmOptional<Int>()

    func initWithJSON(json: Any) {

        let jsonResult = json as! [String: Any]

        id              = jsonResult["id"] as? RealmOptional<Int>

    }
}

以下错误消息迫使我打开可选包装。

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以尝试

id.value = (jsonResult["id"] as? Int  ?? 0 ) 

声明

var id = RealmOptional<Int>()

不是可选的,如果您声明像这样

var id:RealmOptional<Int>?

这就像在做

  var str = String()

override func viewDidLoad() {

    super.viewDidLoad() 

    str = "" as? String  // will give error 

答案 1 :(得分:0)

您不应直接修改RealmOptional属性,而应始终修改其value属性,该属性保留基础Optional值。因此,您应该始终将RealmOptional声明为不可变的,因为RealmOptional是引用类型,因此您仍然可以修改其value属性,而不必修改实际引用。

class Menu:Object {

    let id = RealmOptional<Int>()

    func initWithJSON(json: Any) {
        let jsonResult = json as! [String: Any]
        id.value = jsonResult["id"] as? Int
    }
}

甚至更好的是,使RealmOptional符合Codable,然后您也可以使Menu符合它。

extension RealmOptional: Codable where Value:Codable {
    public convenience init(from decoder: Decoder) throws {
        do {
            let value = try decoder.singleValueContainer().decode(Value.self)
            self.init(value)
        } catch {
            if case DecodingError.valueNotFound(_, _) = error {
                self.init(nil)
            } else {
                throw error
            }
        }
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        try container.encode(value)
    }
}

class Menu: Codable {
    let id = RealmOptional<Int>()
}