Swift Closure中的可选链接,其中返回类型必须为Void
我正在创建脚本的双向链接列表,这些脚本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 }
-
void 返回类型注解
2022-07-28 关注 0 浏览13 1答案
-
如果方法的返回类型为Void,我该返回什么?(不无效!)
2021-01-30 关注 0 浏览86 1答案
-
有人可以解释Java中的void返回类型吗?
2021-01-31 关注 0 浏览109 1答案
-
全局函数的Swift协议和返回类型
2021-01-31 关注 0 浏览87 1答案
-
在Swift中,数组[String]切片返回类型似乎不是[String]
2021-01-31 关注 0 浏览78 1答案
-
在Swift中,数组[String]切片返回类型似乎不是[String]
2021-01-31 关注 0 浏览59 1答案
-
Java> = 8中没有args且没有返回类型(void)的“函数”
2021-01-31 关注 0 浏览56 1答案
-
修改SWIG接口文件以支持C void *和结构返回类型
2021-01-29 关注 0 浏览107 1答案
-
为实现接口的类强制返回类型
2021-01-30 关注 0 浏览74 1答案
-
下列函数返回类型为数值型的是( )。
2022-05-11 关注 0 浏览18 1答案