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

@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

最佳答案

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

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

所以它只适用于一个表达式,而无需将它包装在一个闭包中。

关于closures - 如何使用 Swift @autoclosure,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24102617/

10-13 22:55