gpt4 book ai didi

swift - 通过名称改变属性

转载 作者:行者123 更新时间:2023-11-30 14:12:16 25 4
gpt4 key购买 nike

在 Reflection API 的帮助下,我获得了我的类型的属性列表。

func inspectedProperties(ignored: [String] = []) -> [Property] {
var properties = [String]()

for child in self.children() {
guard let label = child.label else {
continue
}

properties += [label]
}

return properties.filter { !ignored.contains($0) }
}

此函数返回所有属性的名称。

现在我想通过知道某个属性的名称来改变它。

class Fruit {
private dynamic var name = "Apple"
}

如果我调用 Fruit().inspectedProperties() 我将得到以下数组 ["name"]

但是是否可以改变名为“name”的变量呢?

最佳答案

好的,我找到了一个非常简单的解决方案,但它不灵活。实际上,您可以使用 KVO 来改变数据类型。为此,您的模型应该是 NSObject 的子类,以启用标记为 动态 的 KVO 功能和变量。

附注类型别名属性=字符串

class Fruit: NSObject {
private dynamic var name = "Apple"
}

然后是变异函数。

func mutateProperty<T>(property: Property) -> T -> () {
return { value in
let filtered = self.children().filter { label, value in
if let label = label where label == property {
return true
}

return false
}

guard let child = filtered.first else {
return
}


if let object = self as? NSObject where child.value is T {
object.setValue(value as? AnyObject, forKey: property)
}
}
}

然后尝试一下:

let fruit = Fruit()
fruit.mutateProperty("name")("Google")
print(fruit.name) // "Google"

它可以工作,但是如果您想使用值类型而不是引用类型,那么它就不起作用。可能有一些低级解决方案,但我不熟悉。如果有人知道如何做,请在这里留下你的答案! :)

关于swift - 通过名称改变属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31639826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com