在Swift 2

时间:2015-06-26 17:26:33

标签: generics dictionary swift2

所以我试图在Swift 2中扩展CollectionType协议

protocol CollectionAccess: CollectionType {
    func getElement<T: Hashable>(key: T) -> Self.Generator.Element?
}

extension Dictionary : CollectionAccess {
    func getElement(key: Key) -> Dictionary.Element? {
        if let value = self[key] {
            return (key, value)
        }
        return nil
    }
}

编译时会抛出错误:

  

错误:输入&#39;词典&#39;不符合协议   &#39; CollectionAccess&#39;扩展词典:CollectionAccess

函数getElement(...)编译得很好并且作为Dictionary的n扩展可以正常工作但不是

extension Dictionary : CollectionAccess

=====进展======================

我设法通过更改字典扩展中的签名来摆脱错误:

extension Dictionary : CollectionAccess {
    func getElement<K: Hashable where K == Dictionary.Key>(key: K) -> Dictionary.Generator.Element? {
        self[key]

现在的问题是:

  

错误:无法下标类型&#39;字典&#39;同   类型指数&#39; K&#39;           自[键]

我想要的是设置签名,说K与Dictionary.Key类型相同,是Hashable。

2 个答案:

答案 0 :(得分:2)

'Key'和'Value'是Dictionary中的占位符,因此您无法在CollectionType协议扩展的方法签名中访问这些 - 所以要使其工作,您必须进行强制转换。

对我来说似乎有些不对,但我认为你可以用这样的方式来解决它:

__asm__

问题是,CollectionType没有与Dictionary的'Key'占位符对应的占位符。并非所有CollectionType都包含键值对,因此使CollectionType具有键/值类型方法没有意义。例如,另一个CollectionType是Array - getElement将为数组返回什么?

答案 1 :(得分:1)

如果可以更改协议声明,您还可以通过制定相关类型要求来解决此问题:

protocol CollectionAccess: CollectionType {
    typealias T = Hashable
    func getElement(key: T) -> Self.Generator.Element?
}

现在您的字典实现按预期工作而无需修改。

(但现在你不能创建[CollectionAccess]类型的数组(仅作为通用函数中的参数,其中必须是&#34;同类&#34;)