当前位置: 首页 > 面试题库 >

如何使用Swift @autoclosure

邢高澹
2023-03-14
问题内容

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

@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

因此,它仅适用于表达式,而无需将其包装在闭包中。



 类似资料:
  • 问题内容: 我正在努力理解它是如何工作的,但是对我来说却很难。=)我有1个视图,有一个按钮和一个小的ImageView区域可供预览。该按钮触发imagepickercontroller,UIView将显示拾取的图像。没有错误,但是图像未显示在UIImageView区域中。 问题答案: 您正在抓取具名,并且不存在此类图像。你注定要抓住用钥匙从词典:

  • 问题内容: 我需要使iPhone震动,但是我不知道如何在Swift中做到这一点。我知道在Objective-C中,您只需编写: 但这对我不起作用。 问题答案: 简短示例: 加载到手机上,它将振动。您可以根据需要将其放在函数或IBAction中。 代码更新: 正如苹果代码文档所写: 在将来的版本中将不推荐使用此功能。请改用AudioServicesPlaySystemSoundWithComplet

  • 问题内容: 我想在我的Swift应用程序中绘制折线。 SWIFT代码 错误: 我找不到解决方案。 问题答案: 首先 ,必须创建一个。 自iOS 7起已弃用,尽管您仍可以在Objective-C中使用它,但在Swift中不支持它。 其次 ,您必须在委托方法中创建并返回一个(不要将其传递给)。 在方法中,传递对象(而不是or )。 以解释传递给哪个对象与返回的对象之间的区别。) 因此,在该方法中,删除

  • 问题内容: 有没有人设法使此功能在Swift中工作? 苹果文档:https : //developer.apple.com/library/prerelease/mac/documentation/Carbon/Reference/QuartzEventServicesRef/index.html#//apple_ref/c/func/CGEventTapCreate 以下是CGEventTapC

  • 问题内容: 在Objective-C中,我们使用以下代码为视图设置RGB颜色代码: 如何在Swift中使用它? 问题答案: 这是该函数的Swift版本(用于获取值的UIColor表示形式):

  • 问题内容: 有人能帮我吗?我找不到完整的语法示例。 问题答案: 不清楚您要问 的 是什么 ,但我注意到您在代码中有几个错误: 您应该创建使用 返回,因此无需将其包装在内部(也称为实例化新对象)。 完成处理程序是一个闭包,下面是创建该特定闭包的方法: } 这是更新的代码: