2015-03-30 83 views
6

的阵列迭代我有结构的数组:“不能分配给”错误通过结构

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

所以,当你轻按:

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

private var collectionData = [CalendarDate]() 

哪个我简单地用这样的日期填充一个collectionView,我只想遍历数据并将它们全部标记为False。

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

为什么我得到这个错误?我认为它将“c”定义为“let”,尽管我在其定义中使用了var。在这种情况下,我可以强迫c变成“var”吗?

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

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

我不知道这个答案,所以我会张贴它作为一个评论,但你有没有尝试'为var c在collectionData'?我知道它适用于其他语言。 – EmilioPelaez 2015-03-30 22:15:09

+0

是的,我试过了,无效的语法。太糟糕了,因为这将解决我的问题;( – 2015-03-30 22:16:20

回答

9

据我了解,迭代器

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,它仍然是一个副本,而不是一个指向原来的,虽然你可以修改ccollectionData保持不变。

答案是A)按照您最初指出的方式使用迭代,或者B)将数据类型更改为类,而不是结构。

+1

这是另一种可能性的结构:对于我在collectionData.indices {...} – Alexey 2016-05-03 09:40:03

4

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