2016-12-14 85 views
0

事實證明,在Dictionary擴展中,下標很無用,因爲它說Ambiguous reference to member 'subscript'。看來我要麼必須做Swift在subscript(Key)中做的或者調用一個函數。有任何想法嗎?使用擴展名中的密鑰的Swift字典訪問值

例如,

public extension Dictionary { 
    public func bool(_ key: String) -> Bool? { 
     return self[key] as? Bool 
    } 
} 

將無法​​正常工作,因爲標被認爲是不明確的。

ADDED我的誤解,從我認爲KeyAssociatedType,而不是一個泛型參數的事實來了。

+0

你走了,現在人們有東西要走 – Alexander

+0

@AlexanderMomchliov我老實說不認爲示例代碼與我所解釋的不同,但我想這會讓問題更易於理解。 – BridgeTheGap

+0

它消除了猜測工作,並且避免了浪費時間進行可比較的測試設置 – Alexander

回答

3

夫特型Dictionary有兩個通用參數KeyValue,和Key可能不是String

這工作:

public extension Dictionary { 
    public func bool(_ key: Key) -> Bool? { 
     return self[key] as? Bool 
    } 
} 

let dict: [String: Any] = [ 
    "a": true, 
    "b": 0, 
] 
if let a = dict.bool("a") { 
    print(a) //->true 
} 
if let b = dict.bool("b") { 
    print(b) //not executed 
} 

對於ADDED一部分。

如果你介紹的Dictionary擴展新的通用參數T需要方法爲所有可能的組合的Key:Hashable工作,ValueT:Hashable)。 KeyT可能不是同一類型。

(例如,Key可能StringT可能Int(均爲Hashable)。你知道你不能Int下標時KeyString

所以,你不能Tkey下標。


有關更新ADDED一部分。

似乎是一個合理的誤解。你已經找到了一個很好的例子,解釋協議與關聯類型不僅僅是一個通用協議。

+0

是的,我明白了。這就是爲什麼返回類型首先是'Bool?'。例如'var dic:[AnyHashable:Any] = [「1」:1]; print(dic [1])給出了一個'nil'。 'Key'必須是'Hashable','String'符合。 – BridgeTheGap

+2

那又如何? 'String'符合'Hashable'並不意味着'Key'總是'String'。 – OOPer

+0

那麼我的函數指定鍵總是'String'。 – BridgeTheGap

相關問題