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

时间:2017-03-09 16:48:40

标签: 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"
    }
}

这不编译:

  

错误:在初始化所有成员之前由闭包捕获的'self'

足够公平:尽管这里显然没有问题,但是编译器不能指望(任意)闭包不会以未定义的方式使用self

当然,我可以通过以下方式解决这个问题:

let bar = self.bar
log("bar is \(bar)")

但这看起来很笨拙。

有没有办法告诉Swift编译器预先评估@autoclosure - 参数,实质上是忽略@autoclosure

PS:我从XCGLogger复制了这个签名。我不确定为什么需要@autoclosure

1 个答案:

答案 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"
    }
}