Swift数组行为

时间:2016-12-23 08:28:34

标签: arrays swift

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

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?

1 个答案:

答案 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()
}