我注意到在 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/