我想使用与Hashable协议和定制协议对应的值初始化一个Set.
我试过了 :
protocol CustomProtocol: Hashable {} let set = Set<CustomProtocol>()
但Xcode抱怨:
Using ‘CustomProtocol’ as a concrete type conforming to protocol
‘Hashable’ is not supported
我该如何实现呢?
提前致谢.
解决方法
你不能做你想做的最直接的原因是Hashable是一个通用协议.因此,它 – 或从它派生的协议 – 不能用作集合的元素类型.通用类型只能作为另一个泛型的约束使用.您将注意到您无法声明Set< Hashable>即使一个集合的元素类型必须符合Hashable.
最简单的方法是制作,而不是一组协议,而是一组对象类型.例如,如果S是符合CustomProtocol的结构(因为它符合Hashable加上任何其他CustomProtocol所需),则可以声明一组S.
例:
protocol CustomProtocol: Hashable { } func ==(lhs:S,rhs:S) -> Bool { return lhs.name == rhs.name } struct S : CustomProtocol { var name : String var hashValue : Int { return name.hashValue } } let set = Set<S>()
如果您想要解决的问题是您想要一个混合类型的集合,但是在某种程度上彼此相当,那么这是通过协议扩展解决的同样的问题,如协议中的讨论所解释的 – 面向WWDC 2015视频.
但是,只要使所有类型的类从NSObject派生,这将变得更简单.您仍然可以使它们采用一些辅助协议,当然,但是该集合不会被定义为一组该协议,而是NSObject.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。