2015-11-19 59 views
1

我想实现一个字典扩展以符合KVC协议:雨燕2.0字典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:符合KVCodable的字符串?

感谢 罗尼

回答

1

这工作,但不是最好的解决方案。

extension Dictionary:KVCodeable { 
    public func valueForKeyPath(keyPath: String) -> AnyObject? { 
     return self[keyPath as! Key] as? AnyObject 
    } 
} 
+0

true,working但潜在危险... 可以这样做: if let k = key as?密钥{ 将自我[k]返回为? AnyObject } – Ron

+0

但基本上这将扩展所有的字典类型,我的目标是找到一个类型 Ron

+0

是的,我想现在可能是一个Swift限制。我无法让它只适用于特定的字典类型。 –

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

总之,冷杉st one可能是最好的一个。否则,你也可以使函数抛出一个以捕捉“错误”的字典。