我在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是多少?

Edit:@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这样的表达式时,它会自动包装到闭包中,在传递到f之前变成{2 > 1}.如果我们将其应用于函数f:

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

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

因此,它只处理一个表达式,而不需要将其封装在闭包中.

Swift相关问答推荐

SwiftUI加载器未覆盖UIKit导航设置中的导航栏

在@ Scrum闭合中捕获具有不可发送类型NSImage的变量'

体积单位从夸脱转换为杯似乎关闭了

如何为任务扩展的泛型静态函数获得自动类型推理

OBJC代码中Swift 演员的伊瓦尔:原子还是非原子?

字典下标或运算符,如果密钥不存在,则添加指定的默认&值是SWIFT?

我可以为UIMenu设定一个固定的订单吗?

SwiftData/PersistentModel.swft:540:致命错误:不支持的关系密钥路径ReferenceWritableKeyPath

更改 SwiftUI 中按钮矩阵的填充 colored颜色

使用索引来访问 libc 定义的元组

TextField 键入未完成

Swift-SceneKit-无法从art.scnassets加载.scn文件

RxSwift 事件触发了两次

令人满意的 var body:协议扩展中的一些视图

用于 Swift 编码的 iOS 应用程序的 Ffmpeg

为什么swiftui中的导航视图栏那么大?

在 Swift 中将两个字节的 UInt8 数组转换为 UInt16

在 unwind segue 之后执行 push segue

在 Swift 中指定 UITextField 的边框半径

Swift 2.0 最低系统版本要求(部署目标)