mic*_*den 5 closures optional ios swift ios8
我正在创建一个双重链接的脚本列表,这些脚本MSScript应该有自己的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
}
}
Run Code Online (Sandbox Code Playgroud)
rscript下一个要运行的脚本在哪里.问题是,如果我删除dispatch_after的最后一行,它就不会编译,这是因为来自可选链接的返回类型已更改run().我随机决定插入Void.self并修复了问题,但我不明白为什么.
这是什么Void.self,它是正确的解决方案吗?
可选链接将右侧的任何结果包装在可选内容内。所以如果run()返回T,则x?.run()返回T?。由于run()返回Void(又名()),这意味着整个可选链接表达式具有类型Void?(或()?)。
当闭包只有一行时,会隐式返回该行的内容。因此,如果您只有这一行,就好像您写了return weakSelf.rscript?.run(). 所以你正在返回 type Void?,但dispatch_async需要一个返回的函数Void。所以他们不匹配。
一种解决方案是添加另一行显式不返回任何内容:
dispatch_after(time, dispatch_get_main_queue()) {
weakSelf.rscript?.run()
return
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
561 次 |
| 最近记录: |