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

时间:2019-06-11 00:18:48

标签: swift

我有一个自动关闭的问题。例如,我们可以有一个具有自动关闭功能的函数

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

之所以经常使用自动闭包,是因为我们希望将闭包的执行延迟到函数主体,但是这样做有什么意义呢?

我可以有这样的东西

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

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

我已经看到自动闭包在断言和其他快速本机功能的实现中使用,但是这使我感到困惑,为什么我们不能只传递literal来代替闭包?

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

1 个答案:

答案 0 :(得分:1)

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

请考虑一个具体示例:

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

使用自动关闭功能,将不会调用expensiveString()。如果没有,它将始终被调用,即使结果从未使用过。

以我的经验,这通常比现代移动或桌面应用程序要麻烦的多。但这就是它的目标。对于服务器进程而言,日志记录性能是一个严重的问题,需要仔细考虑,但是我很少遇到仅通过完全删除日志记录语句才能最好地解决的移动或台式机上的日志记录性能问题。

您正确的说,与字符串 literal 相比,它没有性能上的优势,但是,如果这是您的意思,则message参数应该是StaticString,而不是String。