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

标签 swift parameters initialization closures

考虑这样的代码:

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/

相关文章:

c# - 在构造函数参数中和作为属性具有相似名称的变量的常见做法

swift - 如何链接到第 3 方 Swift 框架

json - Swift 4 可解码, key 在解码时未知

ios - SKPaymentQueue updatedTransactions 未被调用

javascript - 使用 null 检查传递的参数 - JavaScript

c - 在 C 中使用 calloc 初始化 int 数组,但没有接收到清零缓冲区

ios - 如何用 swift 4 中的对象数组这样的结构形成静态数据?

python - 在Python中简单添加

ruby-on-rails - 如何取消初始化/取消定义 Ruby 中的变量,这样我就不会在控制台中收到警告?

c++ - 施工期间初始化?