所以我正在研究IOS Swift,Xcode 6.2上的一段代码,并试图追踪为什么字典中的更改不会使回调永久化。我开始通过打印字典的地址来查看地址的变化,我发现以下几行代码是
的部分println("Address of grouped asset in 811 is " + EtaError.pointerToString(assetGroup!))
assetGroup![groupDid!] = Array<Asset>();
println("Address of grouped asset in 813 is " + EtaError.pointerToString(assetGroup!))
注意:资产组是一个字符串 - &gt;资产数组字典,EtaError.pointerToString是一个返回给定指针地址的函数,这是我写的一个单独的函数。
是否正在分配一个新的键值对,应该更改指向字典的指针的地址?
答案 0 :(得分:3)
Swift中的字典是值,而不是引用,类型为NSDictionary
。副本的更新不会反映在原件中。这是一个最小的例子:
var a = ["name": "John", "location": "Chicago"]
var b = a
b["title"] = "developer"
print(a) // a does not contain the 'title' key
print(b)
更新副本后需要更新原件。你可以深入研究像UnsafeMutablePointer<T>
这样的东西,但这是一条黑暗的道路。
答案 1 :(得分:0)
Dictionary
来自你的评论:
但是我从中调用此函数来更新键值对的类并不反映
中的更改
字典更新不会反映在代码的其他部分。 Dictionary
是Swift中的值类型,这意味着它会在每次分配时被复制,并且代码的每个部分都有其值的私有副本。
然而,地址的变化也很有意思。
Dictionary
的地址会发生变化?地址发生变化,因为在添加值时需要调整Dictionary
的基础数据结构。
您可以在游乐场中使用以下简单代码对其进行测试:
var dict = ["a":"b"]
print(unsafeAddressOf(dict))
// 0x00007ffc216278d0
dict["a"] = "c"
print(unsafeAddressOf(dict))
// address remains: 0x00007ffc216278d0
dict["b"] = "f"
print(unsafeAddressOf(dict))
// new address: 0x00007ffc21705f40
dict["c"] = "f"
print(unsafeAddressOf(dict))
// address remains: 0x00007ffc21705f40
dict["d"] = "f"
print(unsafeAddressOf(dict))
// new address: 0x00007ffc21626db0
...
您将看到只有在添加键/值对时才会发生地址更改,而不是在修改现有键时。
Swift复制后字典的容量加倍,因此,在第一次复制后,您可以再次复制字典之前再添加两个值。
来自文档:
实际容量将是2的最小幂,即&gt; = minimumCapacity。
如果您使用足够的容量初始化字典,您将看到在添加值时不会复制它:
var dict = [String:String](minimumCapacity: 20)