Swift 如何通过字典中的可选值修改字典中的值类型的值?

Swift 如何通过字典中的可选值修改字典中的值类型的值?,swift,optional,Swift,Optional,数组和可选类型都是Swift中的值类型。如下面的示例所示,不能通过一个可选的数组来修改数组 var a = [1, 2] var aOptional: [Int]? = a aOptional![1] = 100 a仍然是[1,2],尽管用aooptional包装的数组已更改为[1100] 话虽如此,谁能向我解释一下下面的代码是如何工作的 var testScores = ["Dave": [86, 82, 84]] testScores["Dave"]![0] = 91 它产生的结果是te

数组和可选类型都是Swift中的值类型。如下面的示例所示,不能通过一个可选的数组来修改数组

var a = [1, 2]
var aOptional: [Int]? = a
aOptional![1] = 100
a
仍然是
[1,2]
,尽管用aooptional包装的数组已更改为
[1100]

话虽如此,谁能向我解释一下下面的代码是如何工作的

var testScores = ["Dave": [86, 82, 84]]
testScores["Dave"]![0] = 91

它产生的结果是
testScores
中的“Dave”数组为[91,82,84]。
testScores
中的“Dave”数组通过可选的
testScores[“Dave”]
进行修改。这是怎么可能的?

Swift中的数组是值类型而不是引用类型a和a可选都指向不同的地址,但不相同。您可以使用打印地址进行确认

var a = [1, 2]
var aOptional: [Int]? = a
aOptional![1] = 100
withUnsafePointer(to: &a) {
    print("Array \(a) has address: \($0)")
}
withUnsafePointer(to: &aOptional) {
    print("Array \(aOptional) has address: \($0)")
}
输出:

Array [1, 2] has address: 0x00007fff5f6c2ae8
Array Optional([1, 100]) has address: 0x00007fff5f6c2ae0
//Both are pointing different memory address
Address: 0x00007fff5a442ac0
["Dave": [91, 82, 84]]
New Array Address: 0x00007fff5a442ae0
["Dave": [91, 82, 84]] //As you can see array's first object is still 91
现在,使用字典,您可以使用
包装可选代码
并更改同一数组的值,如果将其指定为不同的数组,则结果将与
a
a选项
相同

var testScores = ["Dave": [86, 82, 84]]
withUnsafePointer(to: &testScores["Dave"]!) {
    print("Address: \($0)")
}
testScores["Dave"]![0] = 91
print(testScores)
var array = testScores["Dave"]!
array[0] = 100
withUnsafePointer(to: &array) {
    print("New Array Address: \($0)")
}
print(testScores)
输出:

Array [1, 2] has address: 0x00007fff5f6c2ae8
Array Optional([1, 100]) has address: 0x00007fff5f6c2ae0
//Both are pointing different memory address
Address: 0x00007fff5a442ac0
["Dave": [91, 82, 84]]
New Array Address: 0x00007fff5a442ae0
["Dave": [91, 82, 84]] //As you can see array's first object is still 91

Swift中的数组是值类型而不是引用类型a和a可选都指向不同的地址,但不相同。您可以使用打印地址进行确认

var a = [1, 2]
var aOptional: [Int]? = a
aOptional![1] = 100
withUnsafePointer(to: &a) {
    print("Array \(a) has address: \($0)")
}
withUnsafePointer(to: &aOptional) {
    print("Array \(aOptional) has address: \($0)")
}
输出:

Array [1, 2] has address: 0x00007fff5f6c2ae8
Array Optional([1, 100]) has address: 0x00007fff5f6c2ae0
//Both are pointing different memory address
Address: 0x00007fff5a442ac0
["Dave": [91, 82, 84]]
New Array Address: 0x00007fff5a442ae0
["Dave": [91, 82, 84]] //As you can see array's first object is still 91
现在,使用字典,您可以使用
包装可选代码
并更改同一数组的值,如果将其指定为不同的数组,则结果将与
a
a选项
相同

var testScores = ["Dave": [86, 82, 84]]
withUnsafePointer(to: &testScores["Dave"]!) {
    print("Address: \($0)")
}
testScores["Dave"]![0] = 91
print(testScores)
var array = testScores["Dave"]!
array[0] = 100
withUnsafePointer(to: &array) {
    print("New Array Address: \($0)")
}
print(testScores)
输出:

Array [1, 2] has address: 0x00007fff5f6c2ae8
Array Optional([1, 100]) has address: 0x00007fff5f6c2ae0
//Both are pointing different memory address
Address: 0x00007fff5a442ac0
["Dave": [91, 82, 84]]
New Array Address: 0x00007fff5a442ae0
["Dave": [91, 82, 84]] //As you can see array's first object is still 91


Swift中的数组是值类型而不是引用类型a和a可选的都指向不同的引用不一样。@NiravD您应该将其设置为answer@NiravD你刚才提到的那部分对我来说很有意义。我不明白的是,
testScores[“Dave”]
testScores
中的“Dave”数组似乎是同一个对象,而
a
a可选不是同一个对象。由于我找不到一种方法来实际包装一个值类型的对象,在本例中是数组,在一个可选的但是是它的一个副本中,我想知道
testScores[“Dave”]
如何在
testScores
@candleindark中包装“Dave”数组,这两个示例有很大的不同,首先,当您从字典中提取数组时,它将指向您正在包装的同一地址。如果您使用if-let执行相同的操作,它将不会更改字典。@candleindark我认为这可能与内存分配的内部工作方式有关,基于doc,你可以看到,当你为字典下标时,即使是已经存在的值也会被返回,因此它不是一个正在创建的新变量(因为它是一个值类型,所以是复制的),就像你在数组本身上操作一样。“如果字典包含请求键的值,则下标返回一个可选值,该值包含该键的现有值。”。I NSDictionary的内部实现在我的观点中也指向同一个目录Swift中的are值类型非引用类型a和a可选都指向不同的引用不相同。@NiravD您应该将其设置为answer@NiravD你刚才提到的那部分对我来说很有意义。我不明白的是,
testScores[“Dave”]
testScores
中的“Dave”数组似乎是同一个对象,而
a
a可选不是同一个对象。由于我找不到一种方法来实际包装一个值类型的对象,在本例中是数组,在一个可选的但是是它的一个副本中,我想知道
testScores[“Dave”]
如何在
testScores
@candleindark中包装“Dave”数组,这两个示例有很大的不同,首先,当您从字典中提取数组时,它将指向您正在包装的同一地址。如果您使用if-let执行相同的操作,它将不会更改字典。@candleindark我认为这可能与内存分配的内部工作方式有关,基于doc,你可以看到,当你为字典下标时,即使是已经存在的值也会被返回,因此它不是一个正在创建的新变量(因为它是一个值类型,所以是复制的),就像你在数组本身上操作一样。“如果字典包含请求键的值,则下标返回一个可选值,该值包含该键的现有值。”。在我看来,NSDictionary的内部实现也指向同一个方向。我知道
a
a可选是不同的对象,
testScores[“Dave”]
testScores
中的“Dave”数组是同一个对象。我的问题是如何
testScores[“Dave”]
testScores
中的“Dave”数组是同一个对象吗?正如您所指出的,数组是Swift中的值类型。因此,
testScores[“Dave”]
应该只是可选的,
testScores[“Dave”]
@candleindark中包含的
testScores
中的“Dave”数组的一个副本。如果您仍然没有得到它,让我再编辑一个答案example@candleindark试着暂时忘记选择。它实际上只是关于值和引用类型。可选与此功能无关。@candleindark您检查过该链接吗?现在清楚了吗?@NiravD好吧,首先谢谢你的帮助,但我还是不清楚。你告诉我的几乎是我已经怀疑过的,而不是我想要的。我知道价值类型的本质。然而,通过查看这些示例,我发现Swift中数组中的值存储在optionals中。是这样吗?我没有证据,但它似乎符合我们所看到的行为。我理解
a
a可选是不同的对象,并且
tes