Swift 哈希表的条件一致性
对于Xcode 10和Swift 4.2,还有其他类型符合可哈希的Swift 哈希表的条件一致性,swift,conditional,protocols,Swift,Conditional,Protocols,对于Xcode 10和Swift 4.2,还有其他类型符合可哈希的格式,只要它们的元素也符合可哈希的格式(数组,字典,等等) 我目前在我的项目中有一些代码要为Swift 4.1和以下版本添加Hashable一致性,如下所示: extension Array: Hashable where Element: Hashable { public var hashValue: Int { let prime = 31 var result = 1 for element i
格式,只要它们的元素也符合可哈希的格式(数组
,字典
,等等)
我目前在我的项目中有一些代码要为Swift 4.1和以下版本添加Hashable
一致性,如下所示:
extension Array: Hashable where Element: Hashable {
public var hashValue: Int {
let prime = 31
var result = 1
for element in self {
result = prime * result + element.hashValue
}
return result
}
}
但是,即使我添加了#if!swift(>=4.2)
在代码周围,我仍然在Xcode中看到相同的警告
我的问题是,对于Swift 4.1及以下版本,我如何保持与Hashable
的条件一致性,而对Swift 4.2的警告保持沉默?如果Swift(…)
检查您正在运行的语言版本,则条件编译语句
在您的情况下,听起来像是在Swift 4兼容模式下使用Swift 4.2编译器,这为您提供了一个新的解决方案。因此,这将传递条件编译语句,并编译扩展,从而获得重复的一致性
为了检查编译器版本是否低于4.2,您需要以下内容:
// less than 4.2 in Swift 4 compat mode and (less than 4.2 in 3 compat mode or
// greater than 4).
#if !swift(>=4.1.50) && (!swift(>=3.4) || swift(>=4.0))
extension Array : Hashable where Element : Hashable {
public var hashValue: Int {
let prime = 31
var result = 1
for element in self {
result = prime * result + element.hashValue
}
return result
}
}
#endif
有了它,情况会好得多,从Xcode 10 beta 4()开始,Swift 4.2中提供了它。这样,您就可以直接测试编译器版本,忽略它可能运行的任何兼容模式
这对您的具体情况没有帮助,因为您需要Swift 4.2和4.1编译器都能理解代码(Martin也指出了这一点),但对于未来的兼容性问题,您可以使用#if!编译器(>=5)
以便在使用4.2编译器时仅编译代码块。但是#如果!编译器(>=4.2)
不会使用Swift 4.1进行编译,因此这对这个特定的兼容性代码没有帮助。还是我忽略了什么?@MartinR在beta 4中还有什么发行说明没有告诉我们的吗?@MartinR啊,是的,doh:)@matt:我不知道。