gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:03:33 27 4
gpt4 key购买 nike

我正在创建一个双向链接的脚本列表 (MSScripts),它们应该有自己的 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 的最后一行,它不会编译,那是因为 the changed return type of run() from optional chaining .我随机决定插入 Void.self 并解决了问题,但我不知道为什么。

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

最佳答案

可选链接将右侧的结果包装在一个可选的范围内。因此,如果 run() 返回 T,则 x?.run() 返回 T?。由于 run() 返回 Void(又名 ()),这意味着整个可选链接表达式的类型为 Void?(或 ()?)。

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

一个解决方案是添加另一行明确返回任何内容:

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

关于ios - Swift Closure 中的可选链接,其中返回类型必须为 Void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25351925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com