assert在Swift中编写时,我注意到第一个值键入为
assert
@autoclosure() -> Bool
使用重载的方法返回通用T值,并通过进行测试LogicValue protocol。
T
LogicValue
protocol
但是严格遵守眼前的问题。似乎要@autoclosure返回一个Bool。
@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
@auto_closure
考虑一个带有一个参数的函数,一个不带参数的简单闭包:
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:
2 > 1
{2 > 1}
f
func f(pred: @autoclosure () -> Bool) { if pred() { print("It's true") } } f(pred: 2 > 1) // It's true
因此,它仅适用于表达式,而无需将其包装在闭包中。