#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).