swift - 如何通过可选的字典修改值类型的值?

标签 swift option-type

数组和可选类型在 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/

相关文章:

ios - 当 SLComposeViewController 加载时,它会旋转到设备方向,即使我已将 Main UIViewController 固定为 Portrait

swift - 我的 anchor 有什么问题?

ios - 在 swift 中展开多个可选项

python - 带有三元运算符的可选参数

java - 调用具有一个可选参数的方法

java - 如何初始化 Optional<List<T>>?

swift - 尝试使用 coredata 保存待办事项列表不会保存

arrays - 如何调用或访问数组和结构组合中的特定值?

ios - 删除索引路径错误处的行

ios - Swift 惰性和可选属性