使用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。
答案 0 :(得分:5)
为Hashable
元素数组自动合成Hashable
在Swift 4.2中实现。对Equatable
元素数组的Equatable
的自动合成在Swift 4.1中实现。
这在引用的博客条目中似乎有误导性,但是 清楚地列在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 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