gpt4 book ai didi

arrays - Swift 数组行为

转载 作者:行者123 更新时间:2023-11-28 12:34:21 25 4
gpt4 key购买 nike

我创建了一个类看起来像这样

class IntegerReference {
var value = 10
}

然后我分配了包含 IntegerReference 的数组 firstIntegers 和另一个数组 secondIntegersis 只是分配 firstIntegers 的引用>/p>

var firstIntegers = [IntegerReference(), IntegerReference()]
var secondIntegers = firstIntegers

现在我想改变firstIntegers数组的值

firstIntegers[0].value = 100
print(firstIntegers[0].value) //100 it is ok..
print(secondIntegers[0].value) //100 it is ok..

但是当我想修改firstIntegers数组时,它不会影响secondIntegers数组

firstIntegers[0] = IntegerReference()
print(firstIntegers[0].value) //10 it is ok..
print(secondIntegers[0].value) // 100 Why 100? it should be 10 or Not?

最佳答案

当您更改firstIntegers 中的值时,secondIntegers 中的值更改的原因是因为IntegerReference 是一个类(示例1)。

当您替换 firstIntegers 中的实例时,IntegerReference 的新实例将被放置在 firstIntegers 中。但是值为 100 的旧实例仍在 secondIntegers 中,这就是为什么它在访问时仍然打印 100 的原因(示例 2)。

为了向您展示我的意思,我创建了几个示例,包括实例的地址。

数据:

class Foo { 
var value = 10
}

var array1 = [Foo(), Foo()]
var array2 = array1

示例 1:

array1[0].value = 100

print("address:", getAddress(array1[0]), "value:", array1[0].value)
print("address:", getAddress(array2[0]), "value:", array2[0].value)

输出:

address: 0x000060000002d820 value: 100
address: 0x000060000002d820 value: 100

示例 2:

array1[0] = Foo()

print("address:", getAddress(array1[0]), "value:", array1[0].value)
print("address:", getAddress(array2[0]), "value:", array2[0].value)

输出:

address: 0x000060800002c120 value: 10
address: 0x000060000002d820 value: 100

编辑:

如果您想知道我是如何得到地址的:

func getAddress(_ object: AnyObject) -> UnsafeMutableRawPointer {
return Unmanaged.passUnretained(object).toOpaque()
}

关于arrays - Swift 数组行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41297794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com