我正在尝试实现一个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,虽然我不喜欢它在构造者身上的责任。