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
    }
}
Другие вопросы по тегам