The Pragmatic Ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

SwiftのDictionaryのsubscriptとupdateValueの違い

SwiftでDictionaryの値を追加、変更するのに2通りのやりかたがあります。

ひとつはsubscriptdict["key"] = "value"

もうひとつはupdateValuedict.updateValue("value", forKey: "key")

です。

どちらを使ってもDictionaryの値を変更できますが、微妙に違いがあります。

1. 戻り値

updateValueの場合は戻り値で「変更前の値」を返します。 keyが存在しない場合はnilを返します。

var dict1 = ["a": "a"]

print(dict1.updateValue("A", forKey: "a"))
print(dict1.updateValue("b", forKey: "b"))

これを実行すると

"a"
nil

となります。

2. nilをセットしたときの挙動の違い

  • subscriptの場合

    • nilをセットするとそのkey-valueがremoveされます
  • updateValueの場合は

var dict1 = ["a": "a"]

dict1["a"] = nil
print(dict1)

これを実行すると

[:]

となり、key-valueが削除されます。

var dict1 = ["a": "a"]

dict1.updateValue(nil, forKey: "a") // error: nil is not compatible with expected argument type 'String'

これはコンパイルエラーになります

var dict1: [String: String?] = ["a": "a", "b": "b"]

dict1.updateValue(nil, forKey: "b")
print(dict1)

これを実行すると

["a": Optional("a"), "b": nil]

valuenilが設定されます。