Swift Closure中的可选链接,其中返回类型必须为Void

发布于 2021-01-31 23:57:08

我正在创建脚本的双向链接列表,这些脚本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
    }
}

rscript下一个要运行的脚本在哪里。问题是,如果我删除了dispatch_after的最后一行,它就不会编译,这是因为可选链的返回类型已更改run()]。我随机决定插入Void.self并解决了问题,但我不知道为什么。

这是什么Void.self,这是正确的解决方案吗?

关注者
0
被浏览
245
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    可选链接将右侧结果放在可选元素内。因此,如果run()返回T,则x?.run()返回T?。由于run()返回Void(aka
    ()),这意味着整个可选链表达式都具有类型Void?(或()?)。

    当闭包只有一行时,该行的内容将隐式返回。因此,如果只有一行,就好像您写了一样return weakSelf.rscript?.run()。因此,您正在返回类型Void?,但是dispatch_async需要一个返回的函数Void。因此它们不匹配。

    一种解决方案是添加另一行,该行明确不返回任何内容:

    dispatch_after(time, dispatch_get_main_queue()) {
        weakSelf.rscript?.run()
        return
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看