2015-10-20 61 views
0

Xcode7拋出:Swift2:爲什麼這個Dictionary擴展沒有編譯?

Cannot subscript a value of type 'Dictionary<Key,Value>' with an index of type 'T'

缺少什麼我在這裏?

extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject { 
    func boolOr<T:StringLiteralConvertible>(fall: Bool, key: T) -> Bool { 
     return (self[key] as? Bool) ?? fall 
    } 
} 

試圖使其成爲String也不會在boolOr()工作(我得到同樣的錯誤與String代替T

let s = "\(key)" 
return self[s] as? Bool ?? fall 
+0

如果你宣佈你的'extension'與像'鍵約束:StringLiteralConvertible',在你的方法'''聲明對我來說看起來是多餘的,因爲'Key'類型已經滿足了。 –

+0

我同意,但比什麼類型應該'鍵'?簡單地刪除T'的''來構StringLiteralConvertible'沒有幫助,也不做使得'key'明確'String' –

+0

你可以聲明其爲'Key' –

回答

2

正如評論已經提到的,該類型約束 方法不是必需的:

extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject { 
    func boolOr(fall: Bool, key: Key) -> Bool { 
     return (self[key] as? Bool) ?? fall 
    } 
} 

因爲密鑰類型已經限制在擴展聲明。 您的代碼不會編譯,因爲<T:StringLiteralConvertible> 引入了與字典的 Key類型無關的本地類型佔位符T

但實際上我不明白你爲什麼想要把一個約束的 密鑰類型在所有:

extension Dictionary where Value: AnyObject { 
    func boolOr(fall: Bool, key: Key) -> Bool { 
     return (self[key] as? Bool) ?? fall 
    } 
} 
+0

好,它的工作原理,所以首先謝謝。但是爲了我的教育,因爲'Key'不是一個類型,而是某種協議,'key'可以是'Key'類型的嗎?或者'Key'被認爲是一種類型? –

+1

@AvielGross'Key'是必須採用可哈希協議 –

+1

@AvielGross類型:迅捷字典定義爲'公共結構字典<鍵:可哈希,值> {...}',所以'Key'是*類型佔位符*爲密鑰類型。 –