Swift - как мутировать объект struct при итерации по нему
Я все еще не уверен в правилах копирования структуры или ссылки.
Я хочу мутировать объект struct при итерации по нему из массива: Например, в этом случае я хотел бы изменить цвет фона но компилятор кричит на меня
struct Options {
var backgroundColor = UIColor.blackColor()
}
var arrayOfMyStruct = [MyStruct]
...
for obj in arrayOfMyStruct {
obj.backgroundColor = UIColor.redColor() // ! get an error
}
4 ответов
struct
являются типами значений, таким образом, в for
loop вы имеете дело с копией.
просто в качестве теста вы можете попробовать это:
Swift 3:
struct Options {
var backgroundColor = UIColor.black
}
var arrayOfMyStruct = [Options]()
for (index, _) in arrayOfMyStruct.enumerated() {
arrayOfMyStruct[index].backgroundColor = UIColor.red
}
Swift 2:
struct Options {
var backgroundColor = UIColor.blackColor()
}
var arrayOfMyStruct = [Options]()
for (index, _) in enumerate(arrayOfMyStruct) {
arrayOfMyStruct[index].backgroundColor = UIColor.redColor()
}
здесь вы просто перечисляете индекс и получаете прямой доступ к значению, хранящемуся в массиве.
надеюсь, что это помогает.
вы можете использовать Array.indices
избежать игнорирование второго значения с помощью enumerated()
:
for index in arrayOfMyStruct.indices {
arrayOfMyStruct[index].backgroundColor = UIColor.red
}
для Swift 3 Используйте enumrated()
метод.
например:
for (index, _) in arrayOfMyStruct.enumerated() {
arrayOfMyStruct[index].backgroundColor = UIColor.redColor()
}
Кортеж также включает копию объекта, поэтому вы можете использовать for (index, object)
вместо этого, чтобы добраться до объекта напрямую, но поскольку это копия, вы не сможете мутировать массив таким образом и должны использовать index
сделать это. Прямо цитата документация:
Если вам нужен целочисленный индекс каждого элемента, а также его стоимость, использовать метод enumerated () для итерации по массиву. Для каждого элемента в массиве, перечисления() возвращает кортеж, состоящий из целое число и элемент.
Я видел этот метод в коде, и это, кажется, работает
for (var mutableStruct) in arrayOfMyStruct {
mutableStruct.backgroundColor = UIColor.redColor()
}