在 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 中都有一个输入字段会更好,这样您就可以直接进行一对一连接他们之间。
我想知道是否可以通过数组设置 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 中都有一个输入字段会更好,这样您就可以直接进行一对一连接他们之间。