iOS:并发仅在 iOS 15.0.0 或更高版本的协议中可用

Dan*_*ase 11 concurrency deployment-target ios swift

我有一个应用程序,其部署目标是 iOS 12.1,其中许多协议定义带有完成处理程序的函数,即

protocol P {
    func f(_ completion: @escaping: (String) -> Void)
}
Run Code Online (Sandbox Code Playgroud)

我想用新的 async/await iOS 15 语法替换所有这些,以获得更好的代码可读性:

protocol P {
    func f() async -> String
}
Run Code Online (Sandbox Code Playgroud)

但这样做时,我收到错误:

并发仅在 iOS 15.0.0 或更高版本中可用

考虑到我无法将部署目标从 12.1 切换到 15.0,对此有什么好的解决方案吗?

感谢您的帮助

小智 12

对于其他在 15.0 目标上遇到此问题的人。这可能与您的 XCode 版本有关,您需要至少有 XCode 13.2 或更高版本才能在早于 iOS 15 的版本上编译使用 Swift Concurrency 的代码。


Dun*_*n C 5

简短的回答是“目前没有解决方案”。如果您希望应用程序在 iOS 12 及更早版本上运行,则不能使用 async/await 调用,除非您想编写所有异步代码的 2 个版本,一个在 iOS < 15 上运行,另一个在 iOS < 15 上运行在 iOS \xe2\x89\xa5 15 上。

\n

正如乔治在评论中提到的那样,苹果正在尝试找出如何“反向部署”异步/等待支持。如果他们能够做到这一点,你将能够在旧版本中使用现代方法,但我敢打赌苹果不会回到 iOS 12。

\n

编辑:

\n

请参阅下面布拉德利的评论。如果 Apple 能够实现的话,您将获得的最好的结果是 iOS 13 中的异步/等待支持。从 Bradley 发布的链接来看,iOS 12 肯定不会被支持。

\n