考虑这样的代码:
func log(_ msg: @autoclosure @escaping () -> Any?) {
print(msg)
}
class Foo {
let bar = 3
let lazy: String
init() {
log("bar is \(self.bar)")
self.lazy = "always late"
}
}
这不编译:
Error: 'self' captured by a closure before all members were initialized
很公平:即使这里显然没有问题,编译器也不能指望(任意)闭包不以未定义的方式使用 self
(尚未) .
当然,我可以通过以下方式解决这个问题:
let bar = self.bar
log("bar is \(bar)")
但这看起来很笨拙。
有没有办法告诉 Swift 编译器预先计算 @autoclosure
参数,本质上就是忽略 @autoclosure
?
PS:我从XCGLogger复制了这个签名。我不确定为什么那里需要 @autoclosure
。
最佳答案
你可以在你和log
之间放一个蹦床,像这样:
func log(_ msg: @autoclosure @escaping () -> Any?) {
if let msg = msg() {
print(msg)
}
}
func mylog(_ msg: Any?) {
log(msg)
}
class Foo {
let bar = 3
let lazy: String
init() {
mylog("bar is \(self.bar)")
self.lazy = "always late"
}
}
关于swift - 我可以强制评估@autoclosure 参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42700967/