gpt4 book ai didi

Swift:检查编译器是否支持条件一致性

转载 作者:可可西里 更新时间:2023-11-01 01:57:49 24 4
gpt4 key购买 nike

在 XCode 9.3 中,swift 编译器引入了条件一致性,允许我们比较两个可选值。

我们正在开发一个用于支持 Swift 3.2 和 Swift 4.0 的库,我们必须在其中为字典定义以下比较器:

fileprivate func ==(lhs:[String: NSObject]?, rhs: [String:NSObject]?) -> Bool {
var match = true
if let lhs = lhs {
if let rhs = rhs {
match = lhs == rhs
} else {
match = false
}
}
return match
}

在 Swift 3.3 和 Swift 4.1 中,这个比较器不再有效,并在

行上导致无限循环
match = lhs == rhs

匹配器现在调用自身的地方。它是一个库,所以我们不能强制我们的客户使用最新的 XCode 版本。

有没有办法检查编译器是否支持条件一致性?

最佳答案

较新的 Swift 版本为字典和可选类型提供了一个内置的 == 运算符,并且还提供了从非可选类型到可选类型的强制转换(见下面的注释)。

因此我认为最简单的版本是在较新的 Swift 版本中简单地踢出整个 == 函数:

#if !swift(>=3.3)  // check the correct version, I'm not sure about 3.3 or newer
func ==(lhs:[String:Int]?, rhs: [String:Int]?) -> Bool {
print ("check same \(lhs) == \(rhs)")
var match = true
if let lhs = lhs {
if let rhs = rhs {
match = lhs == rhs
} else {
match = false
}
}
return match
}
#endif


var a:[String:NSObject]? = ["a":"c" as NSObject]
var b:[String:NSObject]? = ["a":"c" as NSString]

print (a == b)

备注:

问题在于,在当前的 Swift 版本中,需要 Optional 的函数也可以通过相应的非可选参数调用,如下所示:

func consumesOptional(value: Int?) -> Int {
print ("consuming \(String(describing: value))")
return value!
}

let x: Int = 1
let y = consumesOptional(value: x)
print(y) // "consuming Optional(1)"

因此,如果您创建一个带有可选参数的 func ==,然后(在您的 if let 级联调用 == 中非可选类型,这将导致递归,如以下评论中正确所述。

有关详细信息,请参阅 SE-0121

关于Swift:检查编译器是否支持条件一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49980915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com