Swift 2.0 Dictionary KVC-Extension

时间:2015-11-19 16:14:35

标签: dictionary swift2 protocols 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 个答案:

答案 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
    }
}