Swift -如何在遍历结构体对象时改变它

643ylb08  于 2023-03-17  发布在  Swift
关注(0)|答案(6)|浏览(250)

我仍然不确定结构体复制或引用的规则。
我想在从数组中迭代的时候改变一个struct对象:例如,在这个例子中,我想改变背景颜色,但编译器在对我大喊大叫

struct Options {
  var backgroundColor = UIColor.blackColor()
}

var arrayOfMyStruct = [MyStruct]

...

for obj in arrayOfMyStruct {
  obj.backgroundColor = UIColor.redColor() // ! get an error
}
gv8xihay

gv8xihay1#

struct是值类型,因此在for循环中处理的是副本。
作为一个测试,您可以尝试以下操作:

斯威夫特3:

struct Options {
   var backgroundColor = UIColor.black
}

var arrayOfMyStruct = [Options]()

for (index, _) in arrayOfMyStruct.enumerated() {
   arrayOfMyStruct[index].backgroundColor = UIColor.red
}

斯威夫特2:

struct Options {
    var backgroundColor = UIColor.blackColor()
}

var arrayOfMyStruct = [Options]()

for (index, _) in enumerate(arrayOfMyStruct) {
    arrayOfMyStruct[index].backgroundColor = UIColor.redColor() 
}

在这里,您只需枚举索引,并直接访问存储在数组中的值。
希望这个有用。

guicsvcw

guicsvcw2#

您可以使用Array.indices

for index in arrayOfMyStruct.indices {
    arrayOfMyStruct[index].backgroundColor = UIColor.red
}
fafcakar

fafcakar3#

您正在使用for in对象,这些对象在使用for in循环时被复制到局部变量。此外,数组是struct对象,因此,如果您想改变数组的所有成员,则必须创建原始数组的修改副本,并由原始对象的修改副本填充。

arrayOfMyStructs = arrayOfMyStructs.map { el in
   var el = el
   el.backgroundColor = .red
   return el
}

可以通过添加此阵列扩展来简化它。

斯威夫特4月5日

extension Array {
    mutating func mutateEach(by transform: (inout Element) throws -> Void) rethrows {
        self = try map { el in
            var el = el
            try transform(&el)
            return el
        }
     }
}

用法

arrayOfMyStructs.mutateEach { el in
    el.backgroundColor = .red
}
qcuzuvrc

qcuzuvrc4#

对于Swift 3,请使用enumerated()方法。

例如:

for (index, _) in arrayOfMyStruct.enumerated() {
  arrayOfMyStruct[index].backgroundColor = UIColor.redColor() 
}

元组还包括对象的副本,因此可以使用for (index, object)直接访问对象,但由于它是副本,因此不能以这种方式改变数组,而应该使用index来完成。直接引用文档:
如果需要每个项的整数索引及其值,请改用enumerated()方法迭代数组。对于数组中的每个项,enumerated()方法返回一个由整数和该项组成的元组。

r1zk6ea1

r1zk6ea15#

另一种不用每次都写下标表达式的方法。

struct Options {
    var backgroundColor = UIColor.black
}

var arrayOfMyStruct = [Options(), Options(), Options()]

for index in arrayOfMyStruct.indices {
    var option: Options {
        get { arrayOfMyStruct[index] }
        set { arrayOfMyStruct[index] = newValue }
    }
    option.backgroundColor = .red
}
z0qdvdin

z0qdvdin6#

我在一些代码中看到过这个方法,它似乎正在工作

for (var mutableStruct) in arrayOfMyStruct {
  mutableStruct.backgroundColor = UIColor.redColor()
}

相关问题