Swift 向字典添加键值对是否会更改指针';谁的地址?

Swift 向字典添加键值对是否会更改指针';谁的地址?,swift,Swift,因此,我正在IOS Swift、Xcode 6.2上编写一段代码,并试图追踪为什么字典中的更改不会导致回调永久化。我开始打印字典的地址来查看地址的变化,我发现下面几行代码就是 println("Address of grouped asset in 811 is " + EtaError.pointerToString(assetGroup!)) assetGroup![groupDid!] = Array<Asset>(); println("Address of grouped

因此,我正在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!))
println(“811中分组资产的地址为”+etarror.pointerToString(assetGroup!))
assetGroup![groupDid!]=Array();
println(“813中分组资产的地址为”+etarror.pointerToString(assetGroup!))
注意:资产组是一个字符串->资产数组字典和EtaError.pointerToString是一个返回给定指针地址的函数,这是我编写的一个单独的函数


分配一个新的键值对是否应该更改指向字典的指针的地址?

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)
您需要在更新副本后更新原件。你可以钻研一些东西,比如
unsafemeutablepointer
,但这是一条黑暗的道路。

字典的值语义 根据您的评论:

但是,我从中调用此函数以更新键值对的类并不反映

字典的更新不会反映在代码的其他部分中
字典
是Swift中的一种值类型,这意味着它在每次赋值时都会被复制,并且代码的每个部分都有其值的私有副本

然而,地址的变化也很有趣

为什么
词典的地址在更改?
地址更改是因为在添加值时需要调整
字典
的基础数据结构的大小

您可以在操场上使用以下简单代码进行测试:

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的最小幂,即>=最小容量

如果使用足够的容量初始化字典,则在添加值时将不会复制该字典:

var dict = [String:String](minimumCapacity: 20)

您想知道向字典添加项是否会更改字典在内存中的位置吗?我同意更改字典在内存中的位置,但是,我调用该函数来更新键值对的类并不反映字典中的更改,即使在使用关键字inout传递Apple的swift文档中的字典引用之后,“您可以通过将inout关键字放在参数定义的开头来编写输入输出参数。in-out参数有一个值,该值传入函数,由函数修改,并从函数中传回以替换原始值。“如果我使用相同的值,它应该将字典的值作为引用传递,对吗?即使使用了inout引用,它仍然无法正确更新原始指针: