swift - 为什么选择自动关闭而不是字符串文字?

标签 swift

我有一个关于自动关闭的问题。例如,我们可以有一个像这样的自动关闭的函数

func logHello(ifFalse condition: Bool,
         message: @autoclosure () -> String
    ) {
    guard condition else {
        return
    }
    print("Assertion failed: \(message())")
}

之所以更多时候使用auto closure是因为我们希望将闭包的执行延迟到函数体,但这样做的意义何在?

我可以有这样的东西

func logHello1(ifFalse condition: Bool,
              message: String
    ) {
    guard condition else {
        return
    }
    print("Assertion failed: \(message)")
}

根本不使用闭包,而只是闭包可能产生的最终结果。这不是更好吗?

我已经看到 aotuclosures 用于断言和其他 swift 原生功能的实现,但我很困惑为什么我们不能只传入一个 literal 来代替闭包?

在这种情况下使用自动关闭有什么好处?

最佳答案

您似乎已经回答了您自己的问题:“因为我们希望将闭包的执行延迟到函数体。”这种情况下的关键点是您可能永远不会评估字符串。如果断言为真,则无需计算字符串。

考虑一个具体的例子:

logHello(ifFalse: true, message: expensiveString())

有了自动闭包,expensiveString() 将永远不会被调用。如果没有,它将始终被调用,即使结果从未被使用。

根据我的经验,对于现代移动或桌面应用程序来说,这通常比它值得的麻烦多得多。但这就是它的目标。对于服务器进程,日志记录性能是一个需要仔细考虑的严重问题,但我很少在移动设备或台式机上遇到日志记录性能问题,这种问题不能通过完全删除日志语句来解决。

你是正确的,与字符串 literal 相比没有性能优势,但如果那是你的意思,message 参数应该是 StaticString,而不是 String。 p>

关于swift - 为什么选择自动关闭而不是字符串文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56534932/

相关文章:

Swift UIWebView 检测滚动

ios - UIImage 内部自定义形状和动画

swift - 删除饼图图例中的文本 'DataSet'

ios - 从两个点 ( cgpoint ) sprite kit - swift 检测 Sprite

swift - 可选绑定(bind),与泛型类型无关

ios - GRBD Swift Sqlite

xcode - Xcode Swift 7.3播放音频文件

ios - objectWillChange 不更新 View

ios - 当点击 UITableView 单元格时,我将如何显示 UIDatePicker?

swift - 无法使用 '[Any]' 类型的索引为 'String' 类型的值添加下标