NSCoder decodeDouble необязательного значения

decodeDouble на NSCoder возвращает необязательное значение, но я хотел бы определить, было ли значение ноль, прежде чем оно было закодировано.

Это мой сценарий:

var optionalDouble: Double? = nil

func encode(with aCoder: NSCoder) {
    if let optionalDouble {
        aCoder.encode(optionalDouble, forKey: "myOptionalDouble")
    }
}

convenience required init?(coder aDecoder: NSCoder) {
    optionalDouble = aDecoder.decodeDouble(forKey: "myOptionalDouble") 
    // here optionalDouble is never nil anymore
}

Так что расшифровка двойного возврата 0 в случае, если значение никогда не было установлено, поэтому кажется, что я не могу определить, было ли значение на самом деле 0 или же nil перед кодированием

Есть ли способ для меня, чтобы проверить, был ли дубль нулевым, прежде чем он был закодирован?

1 ответ

Решение состоит в том, чтобы использовать NSNumber вместо Double при кодировании, а затем использовать decodeObject, чтобы вернуть (если оно существует) двойное значение. Например

class A: NSCoding {
    var optionalDouble: Double? = nil

    @objc func encodeWithCoder(aCoder: NSCoder) {
        if let optionalDouble = optionalDouble {
            aCoder.encodeObject(NSNumber(double: optionalDouble), forKey: "myOptionalDouble")
        }
    }

    @objc required init?(coder aDecoder: NSCoder) {
        if let decodedDoubleNumber = aDecoder.decodeObjectForKey("myOptionalDouble") as? NSNumber {
            self.optionalDouble = decodedDoubleNumber.doubleValue
        } else {
            self.optionalDouble = nil
        }
    }
}

С предложением @Hamish, вот версия для Swift 3. Имейте в виду, что нам нужно наследовать класс для NSObject, чтобы заставить работать NSEncoding ( Got Unrecognized selector -replacementObjectForKeyedArchiver: сбой при реализации NSCoding в Swift)

class A: NSObject, NSCoding {
    var optionalDouble: Double? = nil

    func encode(with aCoder: NSCoder) {
        if let optionalDouble = optionalDouble {
            aCoder.encode(optionalDouble, forKey: "myOptionalDouble")
        }
    }

    override init() {
        super.init()
    }

    required init?(coder aDecoder: NSCoder) {
        optionalDouble = aDecoder.decodeObject(forKey: "myOptionalDouble") as? Double
    }
}
Другие вопросы по тегам