【问题标题】:Swift 3: Safe way to decode values with NSCoder?Swift 3:使用 NSCoder 解码值的安全方法?
【发布时间】:2017-02-01 01:05:55
【问题描述】:

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

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

在 Swift 3 中建议的方法是改用这个:

aDecoder.decodeBool(forKey: TestKey)

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

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

【问题讨论】:

  • 如果没有提供给 aDecoder.decodeBool 的布尔值,它会引发错误,因为它只等待布尔值。所以你必须确定它是 Bool,不是吗?
  • 正确,因此检查@pedrouan 不是一种安全的方法。 swift 2 语法会捕获该错误。
  • 你必须知道你正在编码的类型。这在某些情况下有点困难,特别是因为Bool 被编码为BoolBool? 被编码为Object。见stackoverflow.com/questions/38072295/…

标签: swift swift3


【解决方案1】:

我花了很长时间才弄清楚,但您仍然可以像这样解码值。 我对 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") 对布尔值进行编码时,您必须使用 decodeBool 对其进行解码,但是当您像这样对其进行编码时:

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

你仍然可以这样解码:

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

【讨论】:

  • 嗯,这看起来不错,会尝试一下。你在生产应用中使用过这个吗?
  • 嗯,是的,我像这样转换了我的 swift2 代码,并且没有我知道的问题 :-)
【解决方案2】:

当想要使用建议的 decodeBool 时,这是安全的(对于使用 nil-coalescing op. 的较短代码)。

let value = aDecoder.decodeObject(forKey: TestKey) as? Bool ?? aDecoder.decodeBool(forKey: TestKey)

在确定它是 Bool、IMO 的情况下,可以使用 decodeBool。

【讨论】:

  • TestKey 是键(而不是值),并且始终是 String 类型。最有可能的是,它甚至是一个字符串常量。所以解码永远不会被执行。你在测试错误的东西。
  • @Codo 你能详细说明一下吗? TestKey 是一个字符串常量。您还知道在 Swift 3 中解码值的安全方法吗?
  • 我的评论指的是答案的原始版本,与当前版本完全不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
相关资源
最近更新 更多