我有类似这样的模型类,并且不知道如何为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>
}
}
以下错误消息迫使我打开可选包装。
答案 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>()
}