【发布时间】:2019-03-07 17:53:37
【问题描述】:
将 xCode 更新到版本 10(和 swift 4.2)后,我在可选绑定上出现了奇怪的行为
代码如下,它是关于读取json文件的,T是一个泛型类型(这里是String)
// Are there values for configName ?
if let values = cfg[configName] as? [String: Any] {
print("0 - values[langCode!] = ", values[langCode!] ?? "null")
print("1 - values[langCode!] as? T = ", values[langCode!] as? T)
// is there a value for langCode ?
if let value = values[langCode!] as? T {
print("2 - value to return= ", value)
return value
} else {
print("3 - Do something else ")
}
}
在 xCode 9.4.1 和 Swift 4.1 中,我有以下日志:
0 - values[langCode!] = null
1 - values[langCode!] as? T = nil
3 - Do something else
这就是我想要的,values[langCode!] 是 nil 并且演员也返回 nil 所以 else 块被执行。
在带有 Swift 4.2 的 xCode 10 中,我有以下日志:
0 - values[langCode!] = null
1 - values[langCode!] as? T = Optional(nil)
2 - value to return= nil
这里 if let 块被执行,即使 values[langCode!] 为“null”。
一个区别是 Swift 4.2 values[langCode!] as? T 是 Optional(nil) 而在 Swift 4.1 上 values[langCode!] as? T 是 nil。
我检查了 version 4.2 的更改日志,但我看不到可以解释该行为的内容,我还检查了 JSONSerialization(用于序列化 json 文件)没有进行任何更改
是否有人在切换到 Swift4.2 时也遇到过这种情况? 有人有解释吗?还有解决办法吗?
在这种代码中使用可选绑定有什么好处?写if (values[langCode!] != nil) {...而不是可选绑定会不会不好?
谢谢
【问题讨论】:
-
@Hamish 在我看来就像一个真正的复制品 - 是吗?
-
@matt 可能——我只是对 OP 在他们的示例中说
T是String的事实感到有些困惑。如果是这种情况,那么Optional(nil)的输出就没有多大意义。只有当T类似于Any时,它才真正有意义——如果是这样,那么是的,我会说这是一个骗局。 -
你确定
T被推断为String吗?不是String?吗? -
非常感谢,我认为我的问题是所描述的 [stackoverflow.com/questions/52446097/….. 是的,类型是
String?
标签: swift xcode10 ios12 swift4.2 optional-binding