"无法分配到"迭代遍历struct数组的错误

时间:2015-03-30 21:59:22

标签: ios swift

我有一系列结构:

struct CalendarDate {
    var date: NSDate?
    var selected = false
}

private var collectionData = [CalendarDate]()

我只想填写这样的日期:

    for _ in 1...7 {
        collectionData.append(CalendarDate(date: NSDate(), selected: false))
    }

因此,当您点击collectionView时,我只想循环访问数据并将它们全部标记为False。

    for c in collectionData {
        c.selected = false  ///ERROR: Cannot assign to 'selected' in 'c'
    }

为什么我会收到此错误?

如果我这样做,它运作正常,但我想知道我上面做错了什么:

    for i in 0..<collectionData.count {
        collectionData[i].selected = false
    }

3 个答案:

答案 0 :(得分:19)

据我所知,迭代器

for c in collectionData

返回collectionData中项目的副本 - (structs是值类型,而不是引用类型,请参阅http://www.objc.io/issue-16/swift-classes-vs-structs.html),而迭代

for i in 0..<collectionData.count

访问实际值。如果我是正确的,那么分配给迭代器返回的c是没有意义的......它没有“指向”原始值,而

collectionData[i].selected = false

迭代中的

原始值。

其他一些评论员建议

for (var c) in collectionData

但是虽然这允许您分配到c,但它仍然是副本,而不是指向原始的指针,虽然您可以修改c,但collectionData仍然保持不变。

答案是A)使用最初记录的迭代或B)将数据类型更改为类,而不是结构。

答案 1 :(得分:5)

因为默认情况下每个'c'都是let,这是CalendarDate的一个新实例,并且索引处的数组值为for的每一步复制到此,而'c'不是指向数组,它只是索引的副本,因此如果为此设置新值,则新值不适用于数组。 但'i'用作数组的索引,可以直接操作数组的值。

答案 2 :(得分:0)

如果使用结构,则它们是数组中的副本。因此,即使更改它们也只会更改副本,而不会更改数组中的实际对象。

您必须在循环中将它们设置为变量以进行编辑,然后将它们重新分配到数组中。

如果它们是类而不是结构,则不必重新分配部分,只需执行var操作即可。

for (index, var c) in collectionData.enumerated() {
        c.selected = false
        collectionData[index] = c
    }