decodeDouble on 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
}因此,在从未设置值的情况下,解码double返回0,因此在编码之前,我似乎无法识别一个值实际上是0还是nil
,是否有一种方法可以让我在编码之前检查一个双值是否为零?
发布于 2016-11-24 11:27:20
解决方案是在编码时使用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的版本。
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
}
}https://stackoverflow.com/questions/40785028
复制相似问题