“无法分配”错误迭代结构数组

我有一系列结构:

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 } 

据我所知,迭代器

for c in collectionData

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

for i in 0..

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

collectionData[i].selected = false

在迭代中原始值。

一些其他评论员建议

for (var c) in collectionData

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

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

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