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

Swift 为什么选择自动闭包而不是字符串文字?,swift,Swift,我有一个关于自动关闭的问题。例如,我们可以有一个具有如下自动闭包的函数 func logHello(ifFalse condition: Bool, message: @autoclosure () -> String ) { guard condition else { return } print("Assertion failed: \(message())") } func logHello1(ifFalse co

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

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)")
}
大多数情况下使用自动闭包的原因是,我们希望将闭包的执行延迟到函数体,但这有什么意义呢

我可以吃这样的东西

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)")
}
根本不使用闭包,只使用闭包可能产生的最终结果。这不是更好吗

我在断言和swift本机功能的其他实现中见过AOtuclosure,但这让我很困惑,为什么我们不能只传递一个
literal
来代替闭包呢


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

您似乎已经回答了自己的问题:“因为我们希望延迟函数体闭包的执行。”本例中的关键点是,您可能永远不会计算字符串。如果断言为true,则无需计算字符串

作为一个具体的例子:

logHello(ifFalse: true, message: expensiveString())
使用自动关闭时,将永远不会调用
expensiveString()
。如果没有,它将始终被调用,即使结果从未被使用

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


与字符串文字相比,没有性能优势,这是正确的,但如果这是您的意思,
消息
参数应该是StaticString,而不是string。

可能是的副本。至少相关?@rmaddy我知道什么是自动关闭。。以及使用它的原因。。我不明白为什么字符串文字比它更受欢迎,因为它有很多常识。谢谢你的回答。但是我能问一下为什么选择闭包而不是文字吗?例如,类似断言函数。将其作为字符串文字不是比使用闭包更直观吗(因为闭包将意味着对某些内容求值,而在本例中,闭包并不意味着求值)。我只是无法克服这个困惑。我想我不明白你这里所说的“文字”是什么意思。这意味着Swift中的静态字符串,我同意这通常应该是什么,但我不认为这是你真正的问题。闭包并不意味着“计算某物”。它们意味着“可以计算的函数”。在您的示例中,函数可能永远不会被计算。但如果您查看我提供的示例,我使用了字符串文字,它将执行相同的功能,对吗?是的,但您可以传递字符串文字以外的其他内容。如果你想要求它是一个字符串文字,你可以使用
StaticString
,但通常人们的意思是
“失败求值:”+object.description
,它不是一个文字,计算起来可能会很昂贵。是的,所以不管怎样。。为什么要使用自动关闭?既然表演是一样的?超静串?或者,没有特别的原因,只是偏好?