Swift中Task闭包内函数莫名变为异步函数,Xcode报错需加await
问题解答
这个误判和类本身无关,是Xcode类型推断的上下文干扰bug导致的。
原因分析
你的Loader.show()是完全同步的类方法,没有标记async,理论上根本不需要await。但因为它处在Task异步闭包内,且旁边紧跟着另一个异步闭包action(),Xcode的类型推断逻辑出现了混乱,错误地把这个同步方法识别成了异步函数。
解决办法
可以用以下几种方式快速修复:
- 显式传参调用:哪怕用默认值,也把参数写全,帮Xcode明确方法签名:
Loader.show(animated: true) - 明确主线程调用(更合理,因为UI操作必须在主线程):
DispatchQueue.main.async { Loader.show() } - 给同步方法加显式返回类型:在
show方法的声明里明确写-> Void,让Xcode彻底清楚这是同步函数:public class func show(animated: Bool = true) -> Void { // 显示加载器的代码 } - 清理Xcode缓存:重启Xcode或者按
Cmd+Shift+K清理构建缓存,很多时候能直接解决这种临时推断bug。
内容的提问来源于stack exchange,提问作者Nico Dioso
相关产品推荐
相关产品推荐

