如何在 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 中设置可变数量按钮之间的间距?

如何使用 lxml 在属性值中设置命名空间前缀?

如何使用jquery在输入标签中设置previousvalue属性

C#中基类属性值在子类中设置,如何在基类的方法中获取子类设置的值?

如何在 HTML 的输入标签中设置默认值“on”?

Delphi 2009 - 在自定义 Delphi 组件中设置默认属性值