2016-02-17 44 views
2

我想對可選<進行擴展詞典< String,AnyObject > >。我怎麼寫這個?擴展可選<Dictionary <String,AnyObject >>

,我希望它是這樣的

extension Optional where 
Wrapped : Dictionary, 
Key : String, 
Value : AnyObject { ... } 

但就是了字典直接的參數時,即使這個工作,我希望它會抱怨該字符串不是一個協議。所以我儘量

extension Optional where Wrapped : Dictionary<String, AnyObject> { ... } 

,但在這裏抱怨說,type 'Wrapped' constrained to non-protocol type 'Dictionary<String, AnyObject>'

回答

5

使用點語法訪問鍵和值的包裹。

extension Optional where Wrapped: DictionaryLiteralConvertible, Wrapped.Key: StringLiteralConvertible, Wrapped.Value: AnyObject { 
    func doSomething() { 
     print("did it") 
    } 
} 

現在你可以調用這個: Optional(["asdf":123]).doSomething()

但不是這樣的: Optional([123:123]).doSomething()

+0

也許值得一提的是,'讓富=可選([ 「ASDF」:123])'不會有訪問'.doSomething',因爲'foo'的類型是'Optional >',並且由於'Int'是一個值類型,所以它不符合AnyObject。另一方面,'let foo:[String:AnyObject]? =可選的([「asdf」:123])'_will_可以訪問'.doSomething()'(這是上面例子中隱式類型的用法),這個單項的'Value' __NSCFNumber'(obj-c/foundation _class_ type)。 – dfri

+0

@dfri你是對的,如果你導入基金會,否則沒有這樣的橋樑(所以,這是罰款和預期) – user3441734

相關問題