加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift3 – NSKeyedArchiver在Swift 3(XCode 8)中不起作用

发布时间:2020-12-14 05:36:18 所属栏目:百科 来源:网络整理
导读:我将项目迁移到 Swift 3,NSKeyedArchiver不起作用.当我尝试像这样解码对象时,我实际上有一个运行时错误: let startDayTime = aDecoder.decodeObject(forKey: Key.startDayTime) as! Int 它在Xcode 7.3中的Swift 2.2中运行正常.有没有人面临这样的麻烦? 附
我将项目迁移到 Swift 3,NSKeyedArchiver不起作用.当我尝试像这样解码对象时,我实际上有一个运行时错误:
let startDayTime = aDecoder.decodeObject(forKey: Key.startDayTime) as! Int

它在Xcode 7.3中的Swift 2.2中运行正常.有没有人面临这样的麻烦?

附:我在模拟器和设备上都有这个错误.

更新:我使用decodeInteger(forKey key:String)而不是decodeObject(forKey key:String)解决了这个问题.由于某种原因,AnyObject在Swift 3中不会转换为Integer,尽管它在Swift 2.2中

看起来,只有当Swift 2中的NSKeyedArchiver存档的NSData blob与Swift 3中的NSKeyedUnarchiver打开时,才会在Swift 2至Swift 3更新边界上进行.我猜测,在Swift 2中,Bool和Int被编码为NSNumber,但在Swift 3中,它们被编码为原始Bool和Int类型.我相信以下测试支持这一说法:

这在Swift 3中可以解压缩Swift 2编码的Bool,但如果Bool在Swift 3中编码,则返回零:

let visible = aDecoder.decodeObject(forKey: "visible") as? Bool

这在Swift 3中起作用,以解冻Swift 3编码的Bool,但如果Bool在Swift 2中编码,则会崩溃:

let visible = aDecoder.decodeBool(forKey: "visible")

我的解决办法是:

let visible = aDecoder.decodeObject(forKey: "visible") as? Bool ?? aDecoder.decodeBool(forKey: "visible")

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读