"No se puede asignar a" el error de iteración a través de la matriz de struct

Tengo una variedad de estructuras:

struct CalendarDate { var date: NSDate? var selected = false } private var collectionData = [CalendarDate]() 

Lo que simplemente poblo con una date como esta:

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

Entonces, cuando tocas una colecciónView, simplemente quiero recorrer los datos y marcarlos como Falso.

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

¿Por qué recibo este error? Supongo que está definiendo "c" como "let", aunque uso var en todas partes en su definición. ¿Hay algún trabajo en torno al cual pueda forzar que el c sea "var" en este caso?

Si hago esto, funciona bien pero quiero saber qué hice mal arriba:

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

Según lo entiendo, el iterador

for c in collectionData

devuelve copys de los elementos en collectionData – (las structs son types de valor, no types de reference, consulte http://www.objc.io/issue-16/swift-classes-vs-structs.html ), mientras que la iteración

for i in 0..<collectionData.count

accede a los valores reales. Si tengo razón en eso, no tiene sentido asignar al c devuelto por el iterador … no "apunta" al valor original, mientras que el

collectionData[i].selected = false

en la iteración es el valor original.

Algunos de los otros comentaristas sugirieron

for (var c) in collectionData

pero aunque esto le permite asignar a c , sigue siendo una copy, no un puntero al original, y aunque puede modificar c , collectionData permanece intacta.

La respuesta es A) use la iteración como originalmente señaló o B) cambie el tipo de datos a una class, en lugar de una estructura.

porque cada 'c' es por defecto let, y esta es una nueva instancia de CalendarDate y el valor de array en el índice copydo a esto para cada paso de for, y 'c' no es puntero al índice de la matriz y es solo una copy del índice, así que si establece un nuevo valor para esto, el nuevo valor no se aplicará en la matriz. pero 'i' se usa como índice de array y puede manipular directamente los valores de array.