我正在寻找swift中autoclosure和转义闭包的一些区别/目的.我知道一个转义闭包是我们想要在函数返回后执行的东西,但我没有得到autoclosure的概念.
我没有得到autoclosure闭包的概念.
所述autoclosure允许一个函数来在封闭包装的表达,以便它可以在稍后或完全不执行.
了使用的一个很好的例子autoclosure是短路,与发生的行为||.
考虑这个例子:
func willCrash() -> Bool {
fatalError()
return true
}
let good = true
if good || willCrash() {
print("made it")
}
Run Code Online (Sandbox Code Playgroud)
输出:
Run Code Online (Sandbox Code Playgroud)made it
的||操作者使用短路评价:左手侧(左)首先计算,并且仅当LHS评估为假的右手侧(右)进行了评价.
那么,这是如何实现的?好吧,||它只是一个函数,它接受两个参数,每个参数都评估为a Bool并将||它们组合起来返回a Bool.但是在Swift中函数的正常调用方案中,在调用函数之前会对参数进行求值.如果||以明显的方式实施:
func ||(lhs: Bool, rhs: Bool) -> Bool {
return lhs ? true : rhs
}
Run Code Online (Sandbox Code Playgroud)
它会因为willCrash()之前执行||被调用而崩溃.因此,||使用autoclosure将第二个语句包装在一个闭包中,以便它可以延迟评估,直到它在||函数内部.如果第一语句(其之前评估||被称为)是true那么的结果||就是true和闭合不叫,从而避免在该示例中崩溃.
这是以下定义||:
Run Code Online (Sandbox Code Playgroud)static func ||(lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows -> Bool说明 对两个Bool值执行逻辑OR运算.逻辑OR运算符(||)组合两个Bool值,如果至少有一个值为true,则返回true.如果两个值均为false,则运算符返回false.
该运算符使用短路评估:首先评估左侧(lhs),仅当lhs评估为false时评估右侧(rhs).
忽略作为另一个主题的throws/rethrows,实现||变为:
func ||(lhs: Bool, rhs: @autoclosure () -> Bool) -> Bool {
return lhs ? true : rhs()
}
Run Code Online (Sandbox Code Playgroud)
并且rhs()只在被叫时lhs == false.
| 归档时间: |
|
| 查看次数: |
579 次 |
| 最近记录: |