为什么[Int]不符合Swift 4.1中的Hashable?

Jus*_*cia 2 swift

使用Swift 4.1(Xcode 9.3)我正在尝试创建一组[Int],但我得到:

类型'[Int]'不符合协议'Hashable'

但据我所知,https://swift.org/blog/conditional-conformance/表示只要其值符合Hashable,Array现在就符合Hashable.作为一种解决方法,我有:

extension Array: Hashable where Element == Int {
    public var hashValue: Int {
        return debugDescription.hashValue
    }
}
Run Code Online (Sandbox Code Playgroud)

但我仍然想知道为什么我不能免费获得Hashable.

Mar*_*n R 5

在Swift 4.2中实现HashableHashable元素阵列的自动合成.在Swift 4.1中实现EquatableEquatable元素数组的自动合成.

这似乎在引用的博客条目中具有误导性,但在Swift CHANGELOG中清楚地列出:

Swift 4.2

标准库类型Optional,Array,ArraySlice, ContiguousArray,Dictionary,DictionaryLiteral,Range,和ClosedRange 现在符合Hashable协议时其元件或结合类型(视情况而定)符合Hashable.这使得合成 Hashable实现可用于包含这些类型的存储属性的类型.

Swift 4.1

标准库类型Optional,Array,ArraySlice, ContiguousArray,和Dictionary现在符合Equatable协议时,他们的元素类型符合Equatable.这允许== 操作者以构成(例如,一个可以比较型的两个值[Int : [Int?]?]==),以及用于Equatable元素类型定义使用各种算法,例如index(of:).

这也在 Let Optional,Dictionary和Array中有条理地符合 Swift论坛中的Hashable:

在合成Hashable时,我注意到Array,Optional和Dictionary没有条件地符合Hashable,而Set(无条件)则没有.

但是请注意,定义条件符合协议的能力在斯威夫特4.1,所以你可以概括你的扩展

#if swift(>=4.2)
#else
extension Array: Hashable where Element: Hashable {
    public var hashValue: Int {
        // ... whatever ...
    }
}
#endif
Run Code Online (Sandbox Code Playgroud)