swift 3 : Safe way to decode values with NSCoder?

标签 swift swift3

在 Swift 3 之前,您可以像这样使用 NSCoder 解码 bool 值:

if let value = aDecoder.decodeObjectForKey(TestKey) as? Bool {
   test = value
}

Swift 3 中建议的方法是改用它:

aDecoder.decodeBool(forKey: TestKey)

但是 decodeBool 的类引用没有解释如果您正在解码的值实际上不是 bool 值时如何处理这种情况。您不能在 let 语句中嵌入 decodeBool,因为返回值不是可选的。

如何在 Swift 3 中安全地解码值?

最佳答案

我花了很长时间才弄清楚,但你仍然可以像这样解码值。 我在使用 swift3 时遇到的问题是编码方法的重命名:

// swift2:
coder.encodeObject(Any?, forKey:String)
coder.encodeBool(Bool, forKey:String)

// swift3:
coder.encode(Any?, forKey: String)
coder.encode(Bool, forKey: String)

因此,当您使用 coder.encode(boolenValue, forKey: "myBool") 对 bool 值进行编码时,您必须使用 decodeBool 对其进行解码,但是当您像这样对其进行编码时:

let booleanValue = true
coder.encode(booleanValue as Any, forKey: "myBool")

你仍然可以像这样解码它:

if let value = coder.decodeObject(forKey: "myBool") as? Bool {
   test = value
}

关于 swift 3 : Safe way to decode values with NSCoder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39656225/

相关文章:

uiview - UIView 边框中的文本

ios - 如何在 ios 中调整图像大小并具有 3D 效果。

ios - UIImageView 在下一个 ViewController 打开时与 UILabel 重叠

iOS 11,当用户强行杀死时应用程序不更新位置

swift - 类型 'CASPageMenu' 的值没有成员 'currentPageIndex'

ios - Realm 映射 null

ios - 使用 sirikit 读取 BLE 数据

swift - 在 Swift 中向MeasurementFormatter添加额外的unitOptions

ios - Swift:防止 ABPeoplePickerNavigationController 关闭

ios - 我是否也需要在 Realm 中的一个类中编写所有子对象?