Swift中自动和转义关闭的区别和目的是什么?

man*_*mku 2 closures swift

我正在寻找swift中autoclosure和转义闭包的一些区别/目的.我知道一个转义闭包是我们想要在函数返回后执行的东西,但我没有得到autoclosure的概念.

vac*_*ama 7

我没有得到autoclosure闭包的概念.

所述autoclosure允许一个函数来在封闭包装的表达,以便它可以在稍后或完全不执行.

了使用的一个很好的例子autoclosure短路,与发生的行为||.

考虑这个例子:

func willCrash() -> Bool {
    fatalError()
    return true
}

let good = true

if good || willCrash() {
    print("made it")
}
Run Code Online (Sandbox Code Playgroud)

输出:

made it
Run Code Online (Sandbox Code Playgroud)

||操作者使用短路评价:左手侧(左)首先计算,并且仅当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闭合不叫,从而避免在该示例中崩溃.

这是以下定义||:

static func ||(lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows -> Bool
Run Code Online (Sandbox Code Playgroud)

说明 对两个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.

  • @AhmadF,需要明确的是,*closure* 提供了提供延迟的能力。*autoclosure* 使调用者的语法很好,这样他们甚至不必知道 *closure*。 (2认同)