我创建了一个类 看起来像这样
class IntegerReference {
var value = 10
}
然后我分配了包含firstIntegers
和其他数组IntegerReference
的数组secondIntegersis
,只需分配firstIntegers
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?
答案 0 :(得分:2)
更改secondIntegers
中的值时,firstIntegers
中的值更改的原因是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)
输出:
地址:0x000060000002d820值:100
地址:0x000060000002d820值:100
示例2:
array1[0] = Foo()
print("address:", getAddress(array1[0]), "value:", array1[0].value)
print("address:", getAddress(array2[0]), "value:", array2[0].value)
输出:
地址: 0x000060800002c120 值:10
地址:0x000060000002d820值:100
编辑:
如果您想知道我是如何获得地址的:
func getAddress(_ object: AnyObject) -> UnsafeMutableRawPointer {
return Unmanaged.passUnretained(object).toOpaque()
}