小编典典

如何使用Swift @autoclosure

swift

assert在Swift中编写时,我注意到第一个值键入为

@autoclosure() -> Bool

使用重载的方法返回通用T值,并通过进行测试LogicValue protocol

但是严格遵守眼前的问题。似乎要@autoclosure返回一个Bool

编写不带任何参数并返回Bool的实际闭包是行不通的,它要我调用闭包使其进行编译,如下所示:

assert({() -> Bool in return false}(), "No user has been set", file: __FILE__, line: __LINE__)

但是,仅通过Bool即可:

assert(false, "No user has been set", file: __FILE__, line: __LINE__)

那么发生了什么?什么@autoclosure

编辑: @auto_closure已重命名@autoclosure


阅读 342

收藏
2020-07-07

共1个答案

小编典典

考虑一个带有一个参数的函数,一个不带参数的简单闭包:

func f(pred: () -> Bool) {
    if pred() {
        print("It's true")
    }
}

要调用此函数,我们必须传递一个闭包

f(pred: {2 > 1})
// "It's true"

如果我们省略花括号,我们将传递一个表达式,这是一个错误:

f(pred: 2 > 1)
// error: '>' produces 'Bool', not the expected contextual result type '() -> Bool'

@autoclosure在表达式周围创建一个自动关闭。因此,当调用者编写类似的表达式时2 > 1,它会自动包装到一个闭包中,以{2 > 1}在传递给之前变为f。因此,如果我们将其应用于函数f

func f(pred: @autoclosure () -> Bool) {
    if pred() {
        print("It's true")
    }
}

f(pred: 2 > 1)
// It's true

因此,它仅适用于表达式,而无需将其包装在闭包中。

2020-07-07