所以我试图在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。
答案 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;)