Swift: NSDictionaryとDictionaryを正しく使い分ける
7508 ワード
NSDictionary
やNSMutableDictionary
はNSObject
を継承しておりclass
です。
一方Dictionary
はstruct
です。
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
の方は書き変わりません。
Author And Source
この問題について(Swift: NSDictionaryとDictionaryを正しく使い分ける), 我々は、より多くの情報をここで見つけました https://zenn.dev/kyome/articles/97820711741ee0著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol