在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"]
。
但是有可能改变名为" 名称"的变量吗?
答案 0 :(得分:0)
好的,我找到了一个非常简单的解决方案,但它并不灵活。实际上,您可以使用KVO来改变您的数据类型。为此,您的模型应该是 NSObject 的子类,以启用标记为动态的KVO功能和变量。
P.S。
typealias Property = String
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"
它可以工作,但如果你想使用值类型而不是参考值,它将无法工作。可能有一些低级解决方案,但我不熟悉一个。如果有人知道如何,请在这里留下您的答案! :)