KVC Swift 2.1反思

时间:2015-10-29 21:36:26

标签: swift reflection kvc

我正在尝试实现一个KVC等效的是Swift(灵感来自David Owens)使用反射。

valueForKey相当简单,使用反射来获取所有子名称并检索适当的值。 setValueForKey已被证明是相当棘手的,因为Swift反射似乎是只读的(因为readwrite会破坏反思教条)

protocol KVC {
    var codeables: [String: Any.Type] { get }
    mutating func setValue<T>(value: T, forKey key: String)
    func getValue<T>(key: String) -> T?
}


extension KVC {
    var codeables: [String: Any.Type] {
        var dictionary: [String: Any.Type] = [:]
        let mirror = Mirror(reflecting: self)
        for child in mirror.children {
            if let label = child.label {
                 dictionary[label] = Mirror(reflecting: child.value).subjectType
             }
         }
        return dictionary
    }

    mutating func setValue<T>(value: T, forKey key: String) {
        if let valueType = self.codeables[key] where valueType == value.dynamicType {

        }
    }

    func getValue<T>(key: String) -> T? {
        let mirror = Mirror(reflecting: self)
        for child in mirror.children {
            if let label = child.label, value = child.value as? T where label == key {
                return value
            }
        }
        return nil
    }
}

在Swift中是否存在设置动态keypath值而不使用Objective-C运行时或强制conformer是NSObject的子类?似乎答案是肯定的,但是有一些聪明的解决方法,例如ObjectMapper,虽然我不喜欢它在构造者身上的责任。

0 个答案:

没有答案