Swift 哈希表的条件一致性

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

对于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 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:我不知道。