使用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.
在Swift 4.2中实现Hashable了Hashable元素阵列的自动合成.在Swift 4.1中实现Equatable了Equatable元素数组的自动合成.
这似乎在引用的博客条目中具有误导性,但在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)
| 归档时间: |
|
| 查看次数: |
821 次 |
| 最近记录: |