書き方ミスって偶然見つけました。
Swift5で試してます。
compactMapValues
を使ってvalueがnilのペアを弾こうとしたのですが、その過程で躓いて気づきました。
次のコードのアウトプットを予想できますか?
次のコードを実行すると、2つ目のprintでは
["a": Optional("a"), "c": Optional("c")]
が返ってきそうな気がしますが
実際はちょっと違っていました。
var hoge: [String: String?] = ["a": "A", "b": nil, "c": "C"]
let fuga = hoge.compactMapValues({$0})
print(fuga)
hoge = hoge.compactMapValues({$0})
print(hoge)
結果.
["a": "A", "c": "C"]
["b": nil, "a": Optional("A"), "c": Optional("C")]
"b": nil
が復活しています。
ちなみに fuga
の型を [String: String?]
にしても同じことが再現します。
つまり再代入は無関係です。
そして直接printに渡した場合は起きません。
print(hoge.compactMapValues({$0}))
結果.
["c": "C", "a": "A"]
なので恐らく、[String: String]
から[String: String?]
へのキャスト時に内部の変換において何かミスってるのかもしれませんが、詳しくは分かりません。