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

时间:2018-04-29 04:23:17

标签: 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
    }
}

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

1 个答案:

答案 0 :(得分:5)

Hashable元素数组自动合成Hashable 在Swift 4.2中实现。对Equatable元素数组的Equatable的自动合成在Swift 4.1中实现。

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

  

Swift 4.2

     

标准库类型OptionalArrayArraySlice,   ContiguousArrayDictionaryDictionaryLiteralRangeClosedRange   现在符合Hashable协议的元素或绑定类型   (视情况而定)符合Hashable。这使得合成   Hashable实现可用于包含存储的类型   这些类型的属性。

     

Swift 4.1

     

标准库类型OptionalArrayArraySlice,   ContiguousArrayDictionary现在符合Equatable协议   当他们的元素类型符合Equatable时。这允许==   要编写的运算符(例如,可以将[Int : [Int?]?]的两个值与==进行比较),以及使用为其定义的各种算法   Equatable元素类型,例如index(of:)

这也在讨论中 Let Optional, Dictionary and Array conditionally conform to Hashable 在Swift论坛中:

  

合成Hashable时,我注意到Array,Optional和Dictionary在条件上不符合Hashable,而Set(无条件)则符合。

但请注意,定义条件一致性的能力 在Swift 4.1中可以使用 协议,因此您可以进行概括 你的扩展

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