数组和可选类型在 Swift 中都是值类型。如以下示例所示,不能通过数组的可选来修改数组。
var a = [1, 2]
var aOptional: [Int]? = a
aOptional![1] = 100
a
仍然是 [1, 2]
尽管包装在 aOptional 中的数组更改为 [1, 100]
。
话虽如此,谁能给我解释一下下面这段代码是如何工作的?
var testScores = ["Dave": [86, 82, 84]]
testScores["Dave"]![0] = 91
它产生的结果是 testScores
中的“Dave”数组为 [91, 82, 84]。 testScores
中的“Dave”数组通过它的一个可选值 testScores["Dave"]
进行修改。这怎么可能?
最佳答案
Swift 中的数组是值类型而不是引用类型 a 和 aOptional 都指向不同的地址而不是相同的。您可以使用打印地址进行确认。
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
现在用你的字典,你用 !
包装可选的,如果你给它分配不同的数组则改变相同数组的值,那么结果将与 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)
输出:
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 - 如何通过可选的字典修改值类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44235142/