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」であってもブロックが実行されます。
1 つの違いは、Swift 4.2values[langCode!] as? T
では でOptional(nil)
あり、Swift 4.1values[langCode!] as? T
では ですnil
。
バージョン 4.2の変更ログを確認しましたが、その動作を説明できるものは見当たりませんでした。また、JSONSerialization (json ファイルのシリアル化に使用) に変更が加えられていないことも確認しました。
Swift4.2 に切り替えたときに、そのようなことを経験した人もいますか? 誰か説明がありますか?回避策はありますか?
この種のコードでは、オプションのバインディングを使用する利点は何ですか? if (values[langCode!] != nil) {...
オプションのバインディングの代わりに書くのは悪いでしょうか?
ありがとう