Arrays 在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类(引用类型)

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

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]
      

    • 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]
          
      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的情况,我不建议这样做。