如何在 Swift 中设置属性本身可变的属性值
Posted
技术标签:
【中文标题】如何在 Swift 中设置属性本身可变的属性值【英文标题】:How to set an attribute value where the attribute itself is variable in Swift 【发布时间】:2020-10-25 14:04:24 【问题描述】:我有一个包含两列的 TableView - 名称和值,其中名称是来自 CoreData 的对象的类实例的属性名称本身。 value 是一个文本字段,它是 value 或那个属性,我希望用户能够在 tableview 中编辑它。
我有属性名称和分别存储在单独数组中的值。所以我有 propertyArray 和 valueArray 并且数组的顺序与键控对匹配。
因此,我当然可以根据 IndexPath 确定正在编辑哪个属性,但我无法弄清楚如何将实际属性值更改为文本字段中新输入的值。
逻辑是我需要的:
animal.(propertyArray[IndexPath.row]) = textField.text
有没有办法让我创建一个“animal.whateverTheAttributeIs”的字符串变量并以某种方式将其转换为该等式的左侧部分?
【问题讨论】:
我假设您的表格视图中只有一个核心数据实体实例,然后是 x 个属性,即该实例的行数? 是的,完全正确。 那么你有一个特定顺序的属性,所以你应该在行号和属性之间创建一个简单的映射。 是的,我的数据已正确排序。我不知道映射,所以这是我可以研究的东西。我能够得到所有数据的各个点,我必须形成设置 animal.property 的方程,但是我如何指定 animal.x = "Spot" 或 animal.x = "Male" 其中 x 从逐行?我有 x 的文字字符串表示形式,但我不知道如何将其形成方程式本身以设置新的属性值。 使用setValue:forKeyPath:
。
【参考方案1】:
您可以拥有一个字典,使用 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 子类(您的类是),您可以使用 cmets 中提到的 setValue:forKeyPath
if let keypath = rowMap[indexPath.row]
exampleObject.setValue("some value", forKeyPath: keypath)
这有点简化,因为我从您的示例中假设所有属性都是字符串类型
【讨论】:
以上是关于如何在 Swift 中设置属性本身可变的属性值的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 如何在水平 StackView 中设置可变数量按钮之间的间距?
如何使用jquery在输入标签中设置previousvalue属性