Arrays 在Swift中遍历对变量的引用
我正在寻找一种在Swift中使用迭代更改多个变量值的方法。例如:Arrays 在Swift中遍历对变量的引用,arrays,swift,pointers,Arrays,Swift,Pointers,我正在寻找一种在Swift中使用迭代更改多个变量值的方法。例如: var a = false var b = false var c = false func makeAllTrue() { for n in [a, b, c] { n = true } } …但是,我希望遍历指向上述变量的指针/引用数组,而不是值数组 任何建议都将不胜感激。Swift中的数组是结构,因此是值类型 迭代他的孩子,并更改其中一个,将不可能,除非: 子类的类型为aa类(引用类型)
var a = false
var b = false
var c = false
func makeAllTrue() {
for n in [a, b, c] {
n = true
}
}
…但是,我希望遍历指向上述变量的指针/引用数组,而不是值数组
任何建议都将不胜感激。Swift中的数组是结构,因此是值类型 迭代他的孩子,并更改其中一个,将不可能,除非:
- 子类的类型为aa类(引用类型)
- 您迭代索引并更改实际值!
- 例如:
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]
- 例如:
- 子类的类型为aa类(引用类型)
- 您迭代索引并更改实际值!
- 例如:
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]
- 例如:
- Swift中的数组是结构,因此是值类型
迭代他的孩子,并更改其中一个,将不可能,除非:
var a=false
var b=错误
var c=假
变异值(&a,&b,&c){n在
n=正确
}
print(a,b,c)//将被打印为“true”
func mutateValues(u值:UnsafeMutablePointer…,mutate:(输入输出值)->Void){
价值观{
变异(&$0.pointee)
}
}
var a=false
var b=错误
var c=假
变异值(&a,&b,&c){n在
n=正确
}
print(a,b,c)//将被打印为“true”
func mutateValues(u值:UnsafeMutablePointer…,mutate:(输入输出值)->Void){
价值观{
变异(&$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
}
可以使用关键路径执行此操作。假设属性位于类
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
}
您可能可以使用关键路径执行此操作。。。这是在类中还是在结构中?无论如何,这听起来像是个XY问题。你为什么要这么做?如果
a
、b
和c
是如此相关,那么您不能用单个数组属性替换a
、b
和c
吗?也就是说,用var foo=[false,false,false]
替换a
、b
、c
的声明,并将foo.index{foo[i]=true}中的i的循环更改为。
@Sweeper谢谢您的建议。我想以上面的方式这样做的原因是我有一个巨大的变量列表,我将主要单独调用这些变量。但是,我也希望能够一次更改所有内容(例如恢复默认值等),而无需单独键入每个内容或求助于字典和键值。字典有什么问题?即使使用字典或数组,您仍然需要单独键入每一个!您可能可以使用关键路径执行此操作。。。这是在类中还是在结构中?无论如何,这听起来像是个XY问题。你为什么要这么做?如果a
、b
和c
是如此相关,那么您不能用单个数组属性替换a
、b
和c
吗?也就是说,用var foo=[false,false,false]
替换a
、b
、c
的声明,并将foo.index{foo[i]=true}中的i的循环更改为。
@Sweeper谢谢您的建议。我想以上面的方式这样做的原因是我有一个巨大的变量列表,我将主要单独调用这些变量。但是,我也希望能够一次更改所有内容(例如恢复默认值等),而无需单独键入每个内容或求助于字典和键值。字典有什么问题?即使使用字典或数组,您仍然需要单独键入每一个!谢谢你的澄清!我有预感就是这样…酷!如果有帮助的话,你可以投票支持我的答案:)祝你好运!谢谢你的澄清!我有预感就是这样…酷!如果有帮助的话,你可以投票支持我的答案:)祝你好运!我就知道有这样一个肮脏的把戏!考虑到OP的情况,我不建议这样做。我知道有这样一个肮脏的把戏!鉴于OP的情况,我不建议这样做。