🍁

Swift: NSDictionaryとDictionaryを正しく使い分ける

2022/04/13に公開

NSDictionaryNSMutableDictionaryNSObjectを継承しておりclassです。
一方Dictionarystructです。

Swiftではclassは参照渡し、structは値渡しなので、変数に代入した時に浅いコピー(shallow copy)されるか深いコピー(deep copy)されるかに差が出ます。なので、辞書型の値を書き換えるような機能を作る時に挙動を知った上で実装しないと意図しない動作をするかもしれません。

まずは簡単な例から見ていきます。

簡単な例
class Hoge {
    var dict1: NSMutableDictionary = ["apple": 5, "banana": 6]
    var dict2: Dictionary<String,Int> = ["apple": 5, "banana": 6]

    func printDict() {
        print("dict1")
        dict1.forEach { (key: Any, value: Any) in
            print("key: \(key), value: \(value)")
        }

        print("dict2")
        dict2.forEach { (key: Any, value: Any) in
            print("key: \(key), value: \(value)")
        }
    }
}

let hoge = Hoge()
let dict1 = hoge.dict1
var dict2 = hoge.dict2

dict1["cherry"] = 6
dict2["cherry"] = 6

hoge.printDict()
実行結果
dict1
key: apple, value: 5
key: banana, value: 6
key: cherry, value: 6

dict2
key: banana, value: 6
key: apple, value: 5

クラスインスタンス変数の辞書型データを外部で受け取って書き換えた場合、NSMutableDictionaryの方はクラスインスタンスの変数側も書き変わっていますが、Dictionaryの方は書き変わりません。

Discussion