通过引用Swift中的变量进行迭代



我正在寻找一种在Swift中使用迭代来更改多个变量值的方法。一个例子是这样的:

var a = false
var b = false
var c = false
func makeAllTrue() {
for n in [a, b, c] {
n = true
}
}

但是,与其说是一个值数组,不如说我想遍历一个指向上面变量的指针/引用数组。

如有任何建议,我们将不胜感激。

var a = false
var b = false
var c = false
mutateValues(&a, &b, &c) { n in
n = true
}
print(a, b, c) // will be printed "true true true"
func mutateValues<Value>(_ values: UnsafeMutablePointer<Value>..., mutate: (inout Value) -> Void) {
values.forEach {
mutate(&$0.pointee)
}
}

使用键路径可以做到这一点。假设属性在类Foo:中

class Foo {
var a = false
var b = false
var c = false

func makeAllTrue() {
for n in [Foo.a, Foo.b, Foo.c] {
self[keyPath: n] = true
}
}
}

如果Foo是一个结构,请使用mutating func

struct Foo {
var a = false
var b = false
var c = false

mutating func makeAllTrue() {
for n in [Foo.a, Foo.b, Foo.c] {
self[keyPath: n] = true
}
}
}

然而,如果类名很长,我认为这样做是不值得的。

如果这三个属性非常相关,我就不会去处理密钥路径的东西,而是用数组替换abc

var abc = [false, false, false]

并在索引上进行for循环:

for i in abc.indices {
abc[i] = true
}

Swift中的数组是一个结构,因此是一个值类型。

除非

  • 子类的类型是aa类(引用类型(
  • 您可以迭代索引并更改实际值!
    • E.G:

      var a: Int = 1
      var b: Int = 2
      var array: [Int] = [a,b]
      for index in array.indices {
      array[index] += 1
      }
      print(array)      // [2,3]
      

最新更新