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
}
}