- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
考虑这样的代码:
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/
对这个有点惊讶。在 Swift 3 中,这段代码编译... class func test(foo:@autoclosure () -> Void) { } 但这不... typealias Void
考虑以下函数: func whatever(foo: @autoclosure () -> Int) { let x = foo() print(x) } 当然,我们可以这样调用它: what
??的定义运算符是: public func ??(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T 为什么
我今天又开始玩 Swift 并且需要一个 undefined()功能。基本上,一个函数可以是您想要的任何类型,但在实际运行/评估时会崩溃。如果您还没有时间实现某个表达式但想查看程序类型是否检查,这将很
考虑这样的代码: func log(_ msg: @autoclosure @escaping () -> Any?) { print(msg) } class Foo { let b
我注意到在 Swift 中编写 assert 时,第一个值被键入为 @autoclosure() -> Bool 使用重载方法返回通用 T 值,通过 LogicValue protocol 测试是否存
我想知道是否有等同于 Swift's @autoclosure feature 的东西 本质上,我希望能够在一个函数或构造函数/初始化器中创建一个参数,它可以接受另一个接受参数的函数,并执行它: cl
我正在使用 Xcode 8 将代码转换为 Swift,但编译器警告在一些已在 Swift 2.3 中使用闭包语法创建的嵌套函数中添加 @escape。我还发现了一些其他关键字 @noescape 和
我在 Swift 周围闲逛,发现 fatalError 有这个签名: @noreturn public func fatalError(@autoclosure message: () -> Stri
我刚刚将 Xcode 更新到 6.3,以前在 Xcode 6.2 中编译的 Swift 代码现在无法编译。 import Foundation public enum Result { cas
既然 @autoclosure 是参数声明的一部分而不是类型,那么如何声明函数采用可变数量的自动闭包? 之前: public func coalesce(all : @autoclosure () -
我想在 dispatch_async block 中调用一个@autoclosure 参数。 func myFunc(@autoclosure condition: () -> Bool) { d
我是一名优秀的程序员,十分优秀!