NSKeyedArchiver 在 Swift 3 (Xcode 8) 中不起作用

2023-12-24

我已将我的项目迁移到 Swift 3 并且NSKeyedArchiver不起作用。实际上,当尝试像这样解码对象时,我遇到了运行时错误:

let startDayTime = aDecoder.decodeObject(forKey: Key.startDayTime) as! Int

它在 Xcode 7.3 的 Swift 2.2 中完美运行。还有其他人遇到过这样的麻烦吗?

附:我在模拟器和设备上都遇到此错误。


看来,只有当 NSData blob 归档时,这种情况才会发生在 Swift 2 到 Swift 3 更新边界上NSKeyedArchiver在 Swift 2 中是用NSKeyedUnarchiver在 Swift 3 中。我的猜测是在 Swift 2 上,Bool and Int被编码为NSNumber,但在 Swift 3 中,它们被编码为原始的Bool and Int类型。我相信以下测试支持这一说法:

这适用于 Swift 3 来取消存档Bool用 Swift 2 编码,但返回nil如果 Bool 在 Swift 3 中编码:

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

这适用于 Swift 3 来取消存档Bool在 Swift 3 中编码,但如果 Bool 在 Swift 2 中编码,则会崩溃:

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

我的解决方案是:

let visible = aDecoder.decodeObject(forKey: "visible") as? Bool ?? aDecoder.decodeBool(forKey: "visible")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSKeyedArchiver 在 Swift 3 (Xcode 8) 中不起作用 的相关文章

随机推荐