我试图学习迅捷。当我这样做时:
var myIntArray = [Int](count: 3, repeatedValue: 0)
myIntArray[0] = 1
myIntArray[1] = 11
myIntArray[2] = 111
// prints "my array: [1, 11, 111]"
NSLog("my int array: [%d, %d, %d]", myIntArray[0], myIntArray[1], myIntArray[2])
它按预期工作,但是当我将int包装在这样的类中时:
class Foo {
var bar = 0
}
var myWrappedIntArray = [Foo](count: 3, repeatedValue: Foo())
myWrappedIntArray[0].bar = 1
myWrappedIntArray[1].bar = 11
myWrappedIntArray[2].bar = 111
// prints "my array: [111, 111, 111]"
NSLog("my wrapped int array: [%d, %d, %d]", myWrappedIntArray[0].bar, myWrappedIntArray[1].bar, myWrappedIntArray[2].bar)
在尝试修改单个元素时,似乎会修改整个数组。我在这里做错了什么?
答案 0 :(得分:1)
对于这种情况,最好使用Struct
:
struct Foo {
var bar = 0
}
var myWrappedIntArray = [Foo](count: 3, repeatedValue: Foo())
myWrappedIntArray[0].bar = 1
myWrappedIntArray[1].bar = 11
myWrappedIntArray[2].bar = 111
// prints "my array: [1, 11, 111]"
print("my wrapped int array: [%d, %d, %d]", myWrappedIntArray[0].bar, myWrappedIntArray[1].bar, myWrappedIntArray[2].bar)
在您的情况下,您正在处理引用类型值,例如[Foo]
。但是Struct
是值类型并且创建数组的每个元素唯一。
您正在引用myWrappedIntArray[0].bar
和myWrappedIntArray[n].bar
中的同一个对象。
由于构造函数。
var myWrappedIntArray = [Foo](count: 3, repeatedValue: Foo())
您为数组的每个元素重复Foo()
引用,而不是为数组的每个索引创建新类。