使用swift 4.1(xcode 9.3),我试图创建一组[int],但我得到:
类型'[int]'不符合协议'hashable'
但据我所知,https://swift.org/blog/conditional-conformance/表示,只要数组的值符合hashable,它就符合hashable。作为一个解决方案,我有:
extension Array: Hashable where Element == Int {
public var hashValue: Int {
return debugDescription.hashValue
}
}
但是我仍然想知道为什么我不能免费得到哈希表。
最佳答案
Hashable
元素数组的自动合成
在Swift 4.2中实施。在swift 4.1中实现了Hashable
元素数组的自动合成。
这在引用的博客条目中似乎有误导性,但是
在SWIFT中明确列出:
银行代码:4.2
标准库类型Equatable
、Equatable
、Optional
、Array
和ArraySlice
当元素或绑定类型
(视情况而定)符合ContiguousArray
。这使得合成Dictionary
实现可用于包含存储的类型
这些类型的属性。
斯威夫特4.1
标准库类型DictionaryLiteral
和Range
现在符合ClosedRange
协议
当元素类型符合Hashable
时。这允许
要组合的运算符(例如,可以比较类型为Hashable
和Hashable
的两个值),以及使用为定义的各种算法
等效元素类型,例如Optional
。
这也在中讨论
CHANGELOG
在Swift论坛上:
在合成hashable时,我注意到数组、可选和字典在条件上不符合hashable,而set(无条件)符合。
但是请注意,定义条件一致性的能力
在Swift 4.1中有一个协议,因此您可以概括
扩展到
#if swift(>=4.2)
#else
extension Array: Hashable where Element: Hashable {
public var hashValue: Int {
// ... whatever ...
}
}
#endif
关于swift - 为什么[Int]不符合Swift 4.1中的Hashable?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50083359/