Swift 4.1中[Int]为何未遵循Hashable协议?
为什么Swift 4.1中
[Int]无法自动遵循Hashable协议? 首先得明确一个核心关键点:你提到的「当数组元素遵循Hashable时,Array自动获得Hashable支持」的特性,是在Swift 4.2(对应Xcode 10)才正式加入标准库的,而你当前使用的Swift 4.1(Xcode 9.3)并不包含这个功能,这就是你遇到报错的根本原因。
具体背景说明
Swift 4.1虽然首次引入了「条件一致性」的概念,但当时仅为部分类型(比如Optional)添加了相关协议扩展,并没有覆盖Array。直到Swift 4.2的更新中,官方才为Array补充了针对Element: Hashable的Hashable协议实现,所以在你的环境里,[Int]自然无法满足Set对元素必须遵循Hashable的要求。
关于你的临时解决方案的优化建议
你自己编写的扩展确实能解决当前问题,但有两个可以优化的细节:
- 用
debugDescription生成哈希值存在隐患:一方面debugDescription的格式可能随Swift版本变化,导致哈希值不稳定;另一方面字符串哈希的性能不如直接组合元素哈希值。更可靠的实现方式是合并数组内所有元素的哈希值,比如:extension Array: Hashable where Element == Int { public var hashValue: Int { return reduce(0) { $0 ^ $1.hashValue } } } - 如果需要支持更多元素类型的数组,可以把扩展约束放宽为
Element: Hashable,这样所有元素遵循Hashable的数组都能自动获得哈希能力:extension Array: Hashable where Element: Hashable { public var hashValue: Int { return reduce(0) { $0 ^ $1.hashValue } } }
长远解决办法
如果项目允许,建议升级到Xcode 10及以上版本(对应Swift 4.2+),此时标准库已经内置了数组的Hashable条件一致性实现,不需要自己编写扩展就能直接创建Set<[Int]>。
内容的提问来源于stack exchange,提问作者Justin Garcia
相关产品推荐
相关产品推荐

