如何使用自定义类型修改数组中的单个元素

时间:2016-09-12 10:23:39

标签: swift

我试图学习迅捷。当我这样做时:

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)

在尝试修改单个元素时,似乎会修改整个数组。我在这里做错了什么?

1 个答案:

答案 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].barmyWrappedIntArray[n].bar中的同一个对象。

由于构造函数。

var myWrappedIntArray = [Foo](count: 3, repeatedValue: Foo())

您为数组的每个元素重复Foo() 引用,而不是为数组的每个索引创建新类。