我正在寻找一种在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
}
}
}
然而,如果类名很长,我认为这样做是不值得的。
如果这三个属性非常相关,我就不会去处理密钥路径的东西,而是用数组替换a
、b
和c
:
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]