gpt4 book ai didi

closures - 如何使用 Swift @autoclosure

转载 作者:IT王子 更新时间:2023-10-29 04:55:27 29 4
gpt4 key购买 nike

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

@autoclosure() -> Bool

使用重载方法返回通用 T 值,通过 LogicValue protocol 测试是否存在。

但是严格遵守手头的问题。它似乎需要一个返回 Bool@autoclosure

编写一个不带参数并返回 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com