如何使用SWIFT@auto闭包

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

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

@autoclosure() -> Bool

使用重载的方法返回泛型T值,以通过LogicValueprotocol

然而,严格遵守眼前的问题。它似乎想要一个@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. So if we apply this to the function f:

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

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

因此,它只适用于一个表达式,而不需要将其包装在闭包中。

用户回答回答于

下面是一个实用的例子-我的print覆盖:

func print(_ item: @autoclosure () -> Any, separator: String = " ", terminator: String = "\n") {
    #if DEBUG
    Swift.print(item(), separator:separator, terminator: terminator)
    #endif
}

扫码关注云+社区