2015-11-19 62 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可能是最好的一個。否則,你也可以使函數拋出一個以捕捉「錯誤」的字典。