2016-12-14 81 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

相关问题