Вы не должны напрямую изменять свойство RealmOptional
, вы всегда должны изменять его свойство value
, которое содержит базовое значение Optional
.По этой причине вы всегда должны объявлять RealmOptional
s как неизменяемые, поскольку 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>()
}