以其名称改变财产

时间:2015-07-26 17:22:13

标签: swift reflection ios8 swift2 ios9

在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"]

但是有可能改变名为" 名称"的变量吗?

1 个答案:

答案 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"

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