使用扩展中的键对Swift字典进行访问

fun*_*ct7 0 extension-methods dictionary hashtable subscript swift

事实证明,在Dictionary扩展中,下标因为说是非常没用Ambiguous reference to member 'subscript'。看来我要么必须做Swift要做的事情,要么要subscript(Key)调用一个函数。有任何想法吗?

例如,

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

由于下标被认为是模棱两可的,因此将无法使用。

添加我的误解来自以下事实:我认为这KeyAssociatedType一个通用参数,而不是通用参数。

OOP*_*Per 6

雨燕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
}
Run Code Online (Sandbox Code Playgroud)

对于添加的部分。

如果引入了一个新的通用参数T中的延伸Dictionary,该方法需要适用于所有可能组合Key:HashableValueT:Hashable)。Key并且T可能不是同一类型。

(例如,Key可能是StringT可能是Int(两者Hashable)。您知道不能使用Intwhen Key是下标String。)

因此,您不能使用key类型下标T


对于更新的添加部分。

似乎是一种合理的误解。您已经找到了一个很好的示例,它解释了具有关联类型的协议不仅仅是通用协议。

  • 所以呢?`String`符合`Hashable`并不意味着`Key`总是`String`。 (2认同)