Swift 2.0 словарь KVC-расширение
Я пытаюсь реализовать расширение словаря, чтобы соответствовать протоколу 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?
спасибо Ронни
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
}
}
В заключение первый, вероятно, самый лучший. В противном случае вы также можете сделать функцию метательной, чтобы ловить "неправильные" словари.
Это работает, но не самое лучшее решение.
extension Dictionary:KVCodeable {
public func valueForKeyPath(keyPath: String) -> AnyObject? {
return self[keyPath as! Key] as? AnyObject
}
}