首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可选值的NSCoder decodeDouble

可选值的NSCoder decodeDouble
EN

Stack Overflow用户
提问于 2016-11-24 11:17:43
回答 1查看 1.2K关注 0票数 2

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

这是我的场景:

代码语言:javascript
复制
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

,是否有一种方法可以让我在编码之前检查一个双值是否为零?

EN

回答 1

Stack Overflow用户

发布于 2016-11-24 11:27:20

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

代码语言:javascript
复制
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的版本。

代码语言:javascript
复制
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
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40785028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档