使用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
标准库类型
EquatableEquatableOptionalArrayArraySlice
当元素或绑定类型
(视情况而定)符合ContiguousArray。这使得合成
Dictionary实现可用于包含存储的类型
这些类型的属性。
斯威夫特4.1
标准库类型
DictionaryLiteralRange现在符合ClosedRange协议
当元素类型符合Hashable时。这允许
要组合的运算符(例如,可以比较类型为HashableHashable的两个值),以及使用为定义的各种算法
等效元素类型,例如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/

10-08 23:15