首页 > 解决方案 > 如何在 Swift 中设置属性本身可变的属性值

问题描述

我有一个包含两列的 TableView - 名称和值,其中名称是 CoreData 中对象的类实例的属性名称本身。value 是一个文本字段,它是 value 或该属性,我希望用户能够在 tableview 中编辑它。

我有属性名称和分别存储在单独数组中的值。所以我有 propertyArray 和 valueArray 并且数组的顺序与键控对匹配。

因此,我当然可以根据 IndexPath 确定正在编辑哪个属性,但我无法弄清楚如何将实际属性值更改为文本字段中新输入的值。

逻辑是我需要:

animal.(propertyArray[IndexPath.row]) = textField.text

有没有办法让我创建一个“animal.whateverTheAttributeIs”的字符串变量并以某种方式将其转换为该等式的左侧部分?

标签: iosswiftcore-datatableview

解决方案


您可以拥有一个字典,其中包含使用 KeyPath 的行号和属性之间的映射

struct Example {
    var id: String
    var name: String
    var text: String
}

let rowMap: [Int: WritableKeyPath<Test, String>] = [0: \.id, 1: \.name, 2: \.text]

然后您在字典中查找以从一行中获取正确的键路径

if let keypath = rowMap[indexPath.row] {
    exampleObject[keyPath: keypath] = "some value"
}

或者对于一个 NSObject 子类(你的类是)你可以使用setValue:forKeyPath评论中提到的

if let keypath = rowMap[indexPath.row] {
    exampleObject.setValue("some value", forKeyPath: keypath)
}

这有点简化,因为我从您的示例中假设所有属性都是 String 类型


推荐阅读