Изменяемость элемента итератора в цикле For-In с массивом в Swift

#arrays #swift #iterator #immutability #for-in-loop

#массивы #swift #итератор #неизменяемость #для-в-цикле #for-in-loop

Вопрос:

У меня есть некоторый код в Swift 3.0, подобный so, для попытки обновить свойство в массиве элементов…

 for point in listOfPoints {
    var pointInFrame : Float = Float(point.position.x * sensorIncomingViewPortSize.width)   Float(point.position.y)
    point.status = getUpdateStatus( pointInFrame )
}
  

Однако я получаю ошибку компиляции:
‘Невозможно присвоить свойству: ‘point’ является константой ‘let» [для строки 3]

Можно ли каким-либо образом изменить итератор (point) в Swift, например, как вы можете использовать ‘inout’ для параметра функции?

Или вы должны выполнить эту задачу другим способом?

Заранее спасибо.

Stan

Ответ №1:

Просто измените его на var вместо let того, где вы объявляете point . let является constant .

Комментарии:

1. Ах, хорошо … не знал, что вы будете указывать это для переменной в цикле for-in.

2. Np, рад помочь @FTNomad

3. Предполагая, что point это элемент с типом значения, аннотирование его как var просто сделает копию доступной внутри изменяемого цикла. Изменение этой копии не повлияет на точки в массиве.

Ответ №2:

Другой способ добиться этого:

 for i in 0 ... myStructArray.count - 1 {
    var st = myStructArray[i]
    st.someStringVariable = "xxx"   // do whatever you need with the struct
    st.someIntVariable = 123        // do more stuff

    // last step (important!):
    myStructArray[i] = st           // necessary because structs are VALUE types, not reference types.
}
  

Если вам нужно внести только одно изменение, вы можете опустить этапы определения локальной переменной ( st в примере) в качестве элемента массива, а затем впоследствии установить элемент массива равным локальной переменной. Но если вы собираетесь вносить много изменений в элемент, если может быть более чистым создание локальной переменной, внесите в нее все изменения, а затем назначьте эту переменную обратно элементу массива.

Если бы массив принадлежал классу, а не структуре, этот последний шаг обратного присвоения не был бы необходимым (ссылочный тип — Class, против типа значения — Struct).