decodeDouble上的NSCoder返回一个非可选值,但我想确定在编码之前该值是否为nil。

这是我的情况:

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
有没有办法让我检查双精度在编码之前是否为零?

最佳答案

解决方案是在编码时使用NSNumber而不是Double,然后使用encodeObject返回(如果存在)双精度值。例如

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: crash when implementing NSCoding in 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
    }
}

关于ios - NSCoder encodeDouble可选值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40785028/

10-10 16:44