我有一个关于自动关闭的问题。例如,我们可以有一个像这样的自动关闭的函数
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/