我正在尝试实现字典扩展以符合KVC协议:
protocol KVCodeable {
func valueForKeyPath(keyPath: String) -> AnyObject?
}
这样做的原因,我希望能够从NSManagedObjects或Dictionarys获取值。
所以我定义了一个模型对象:
var modelObject: KVCodeable?
稍后,我正在访问该模型对象,尝试获取值:
let value: AnyObject? = modelObject?.valueForKeyPath(keyPath)
我的模型对象在某些情况下是NSManagedObject,在其他一些情况下,它是一个快速的字典或其派生词。
extension NSManagedObject: KVCodeable {} //already done
: KVCodeable
\/
extension Dictionary where Key: String {
func valueForKeyPath(keyPath: String) -> AnyObject? {
return self[keyPath]
}
}
如何定义我的字典扩展名,其中Key:String符合KVCodable?
感谢 罗尼
答案 0 :(得分:2)
这个问题总体上无法解决,但有两个半解决方案:
1)扩展所有词典:
extension Dictionary: KVCodeable {
func valueForKeyPath(keyPath: String) -> AnyObject? {
guard let key = keyPath as? Key else { return nil }
return self[key] as? AnyObject
}
}
2)仅扩展特定词典,但您必须删除与KVCodeable
的一致性:
// You have to make this protocol since:
// extension Dictionary where Key == String { ... }
// is currently not allowed
protocol StringType { var string: String { get } }
extension String: StringType { var string: String { return self } }
extension Dictionary where Key: StringType, Value: AnyObject {
func valueForKeyPath(keyPath: String) -> AnyObject? {
guard let key = keyPath as? Key else { return nil }
return self[key] as? AnyObject
}
}
总之,第一个可能是最好的一个。否则你也可以把这个函数作为抛出函数来捕获"错误"字典。
答案 1 :(得分:1)
这有效,但不是最好的解决方案。
extension Dictionary:KVCodeable {
public func valueForKeyPath(keyPath: String) -> AnyObject? {
return self[keyPath as! Key] as? AnyObject
}
}