Как присвоить ноль RealmOptional <Int> - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть класс модели, похожий на этот, и я не знаю, как назначить быстрое необязательное значение для 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 голосов
/ 05 декабря 2018

Вы не должны напрямую изменять свойство 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>()
}
0 голосов
/ 04 декабря 2018

Вы можете попробовать

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...