考虑这样的代码:
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"
}
}
这不编译:
错误:在初始化所有成员之前由闭包捕获的'self'
足够公平:尽管这里显然没有问题,但是编译器不能指望(任意)闭包不会以未定义的方式使用self
。
当然,我可以通过以下方式解决这个问题:
let bar = self.bar
log("bar is \(bar)")
但这看起来很笨拙。
有没有办法告诉Swift编译器预先评估@autoclosure
- 参数,实质上是忽略@autoclosure
?
PS:我从XCGLogger复制了这个签名。我不确定为什么需要@autoclosure
。
答案 0 :(得分:1)
你可以在你和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"
}
}