2

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) {...オプションのバインディングの代わりに書くのは悪いでしょうか?

ありがとう

4

2 に答える 2