iOS部署目标为12.1时协议中使用async/await报错如何解决?
解决方案
你可以根据项目可接受的最低部署版本调整,选择以下适配方案:
- 方案1:保留原有回调协议,仅为iOS15+扩展async/await接口(兼容iOS12.1,无版本升级要求)
原有带completion的协议定义完全保留,无需修改历史实现逻辑,仅通过扩展为高版本系统增加async封装方法,所有实现协议的类会自动获得async能力:
原有协议保持不变:
新增iOS15+专属扩展:protocol P { func f(_ completion: @escaping (String) -> Void) }
适配后,iOS15及以上的业务代码可以直接调用async版本的方法提升可读性,iOS12.1~14的业务代码继续使用原有回调接口即可。@available(iOS 15.0, *) extension P { func f() async -> String { await withCheckedContinuation { continuation in f { result in continuation.resume(returning: result) } } } } - 方案2:升级最低部署目标到iOS13,使用Swift Concurrency回退部署特性(改动最小)
Xcode14及以上版本支持Swift Concurrency回退部署到iOS13.0、macOS10.15及以上版本,如果你可以接受将项目最低部署目标从iOS12.1升级到iOS13.0,无需额外兼容代码,直接写async/await语法即可,不会出现版本报错。 - 方案3:iOS12.1版本下使用第三方异步库优化回调可读性
如果必须死守iOS12.1的部署要求,也可以引入支持iOS12的第三方异步库(如老版本PromiseKit、RxSwift),将回调封装为链式调用结构,相比嵌套回调可读性也有明显提升。
内容的提问来源于stack exchange,提问作者Dannis Case
相关产品推荐
相关产品推荐

