当前位置: 首页 > 面试题库 >

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

姜俊逸
2023-03-14
问题内容

我正在创建脚本的双向链接列表,这些脚本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,这是正确的解决方案吗?


问题答案:

可选链接将右侧结果放在可选元素内。因此,如果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
}


 类似资料:
  • 为了方便起见,我将setter方法返回类型更改为对象,例如: 但在tomcat做出这一改变之后 PropertyNotFoundException: 为了消除这个异常,我将修饰符从private更改为public,但仍然得到相同的错误。所以我有两个问题; null

  • 问题内容: PHP 7引入了返回类型声明。这意味着我现在可以指示返回值是某个类,接口,数组,可调用或新暗示的标量类型之一,对于函数参数而言,这是可能的。 通常,值并不总是存在,并且您可能返回某种类型的值或null。尽管可以通过将参数的默认值设置为null()来使参数为可空,但似乎没有办法对返回类型执行此操作。的确是这样,还是我不知如何找到方法呢?这些不起作用: 问题答案: PHP 7.1现在支持可

  • 问题内容: 它返回此错误:此方法必须返回boolean类型的结果。我究竟做错了什么? 问题答案: 现在,不能保证该函数返回a ,因为很可能不会输入任何一条语句。 您可以像这样修复它(但 只有 在您的逻辑确实需要它的情况下 才 这样做):

  • 问题内容: 我最近在Swift中进行了大量编程。今天,当出现问题时,我在JavaScipt中做了一些工作: 是否有类似于JavaScript中的可选链接的内容?一种防止没有任何变量的方法? 例: 将失败一半的时间,因为有时返回未定义。 我能想到的唯一解决方案是一个函数: 我希望能够执行以下操作: 仅在返回对象后才执行问号后的部分。 但这不是很精巧。有更好的东西吗?运营商的神奇组合? 编辑 我知道我

  • 我检查了这个问题,在elasticsearch中查询DSL中必须和过滤器有什么区别?并阅读答案。 据我所知,必须和过滤器应该返回相同的结果。我说的对吗?但是当我把过滤查询改为必须时,我收到了更多的结果?我做错了什么? 我比较了过滤器,必须查询并得到不同的结果。