Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift闭包中的可选链接,返回类型必须为空_Ios_Swift_Closures_Ios8_Optional - Fatal编程技术网

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上下文中使用。”。