gpt4 book ai didi

swift - 我可以强制评估@autoclosure 参数吗?

转载 作者:可可西里 更新时间:2023-11-01 02:06:19 25 4
gpt4 key购买 nike

考虑这样的代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com