LoginSignup
1
1

More than 3 years have passed since last update.

compactMapValuesの戻り値をそのまま再代入しようとしたらハマった

Posted at

書き方ミスって偶然見つけました。
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?]へのキャスト時に内部の変換において何かミスってるのかもしれませんが、詳しくは分かりません。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1