Ios Swift闭包中的可选链接,返回类型必须为空
我正在创建一个脚本(Ios Swift闭包中的可选链接,返回类型必须为空,ios,swift,closures,ios8,optional,Ios,Swift,Closures,Ios8,Optional,我正在创建一个脚本(MSScripts)的双链接列表,它们应该有自己的run()实现,并且在准备好后调用下一个脚本(rscript)。我想创建的脚本之一就是延迟。看起来是这样的: class DelayScript : MSScript { var delay = 0.0 override func run() { let delay = self.delay * Double(NSEC_PER_SEC) let time = dispatch_t
MSScript
s)的双链接列表,它们应该有自己的run()
实现,并且在准备好后调用下一个脚本(rscript
)。我想创建的脚本之一就是延迟。看起来是这样的:
class DelayScript : MSScript
{
var delay = 0.0
override func run() {
let delay = self.delay * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
let weakSelf = self
dispatch_after(time, dispatch_get_main_queue()) {
weakSelf.rscript?.run()
Void.self
}
}
init(delay: Double) {
super.init()
self.delay = delay
}
}
其中rscript
是下一个要运行的脚本。问题是,如果我在之后删除dispatch_的最后一行,它将无法编译,这是因为。我随机决定插入Void.self
,它解决了这个问题,但我不知道为什么
这是什么?
Void.self
,它是正确的解决方案吗 可选链接将右侧的结果封装在可选链接中。因此,如果run()
返回T
,那么x?.run()
返回T?
。由于run()
返回Void
(又称()
),这意味着整个可选链接表达式的类型为Void?
(或()?
)
当闭包只有一行时,将隐式返回该行的内容。因此,如果只有这一行,就好像编写了return weakSelf.rscript?.run()
。因此,您正在返回类型Void?
,但是dispatch\u async
需要一个返回Void
的函数。所以他们不匹配
一种解决方案是添加另一行,该行显式不返回任何内容:
dispatch_after(time, dispatch_get_main_queue()) {
weakSelf.rscript?.run()
return
}
在Swift 1.2(Xcode 6.3 beta)中,这里不再需要显式返回语句。从发行说明中可以看出:“具有非Void返回类型的未注释单表达式闭包现在可以在Void上下文中使用。”。