在 swift 中的数组中设置 class 属性

Set class property inside an array in swift

我想知道是否可以通过数组设置 class 属性:

class Test {
    var x: Int = 0
    var y: Int = 0
    var z: Int = 0
}


let newTest = Test()

let myArray = [newTest.x, newTest.y, newTest.z]

所以我创建了一个具有 class 属性的数组。现在我想访问 属性 对象本身并将其设置为一个值,有点像这样(我知道这会将索引 0 处的数组设置为 1,但我希望总体思路很清楚):

myArray[0] = 1 // I want to set newTest.x = 1

下面的当然有效,但我需要数组中的 属性 对象本身:

let myArray = [newTest, newTest, newTest]
myArray[0].x = 1

更新

我现在有一个整数数组,但我需要 class 属性 的引用,所以我可以设置它的值。

用例: 我有一个 TextField 作为用户输入。用户输入应以“,”分隔。而且我事先不知道我会得到多少物品。 因此我想我 运行 一个 for 循环,所以我可以根据项目的数量设置 class 属性。

newItem = Item()

var myClassPorperties = [newItem.cat1, newItem.cat2, newItem.cat3]

if let categoriesArray = categoriesTextField.text?.components(separatedBy: ",") {
                            
    for i in 0...categoriesArray.count - 1 {
                     
      myClassProperties[i] = categoriesArray[i]
                    
   }
}

采用逗号分隔值列表并使用它们来更新对象似乎有点奇怪,但考虑到这是一种方法。

创建一个函数以在索引(数组中)和 class

中的 属性 之间进行映射
func update(at index: Int, with value: Int) {
    switch index {
    case 0:
        x = value
    case 1:
        y = value
    case 2:
        z = value
    default:
        print("Value \(value) at \(index) igonred")
    }
}

并像这样使用它

categoriesArray.compactMap(Int.init).enumerated().forEach(newTest.update)

另一个解决方案是使用 KeyPath

func keyPath(for index: Int) -> WritableKeyPath<Test, Int>? {
    switch index {
    case 0:
        return \.x
    case 1:
        return \.y
    case 2:
        return \.z
    default:
        return nil
    }
}

然后使用以下代码使用您的数组更新对象

categoriesArray.compactMap(Int.init).enumerated().forEach {
    if let keyPath = keyPath(for: [=13=].offset) {
        newTest[keyPath: keyPath] = [=13=].element
    }
}

我仍然认为 class 中的每个 属性 在 UI 中都有一个输入字段会更好,这样您就可以直接进行一对一连接他们之间。