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()
}