iOS:并发仅适用于 iOS 15.0.0 或更高版本的协议

iOS: Concurrency is only available in iOS 15.0.0 or newer in protocol

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

protocol P {
    func f(_ completion: @escaping: (String) -> Void)
}

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

protocol P {
    func f() async -> String
}

但是这样做时,出现错误:

Concurrency is only available in iOS 15.0.0 or newer

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

感谢您的帮助

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

正如 George 在他的评论中提到的那样,Apple 正试图弄清楚如何“反向部署”async/await 支持。如果他们能够做到这一点,您将能够对旧版本使用现代方法,但我敢打赌 Apple 不会回到 iOS 12.

编辑:

请参阅下面布拉德利的评论。如果 Apple 能够做到这一点,您将获得的最好的支持是 iOS 13 中的 async/await 支持。从 link Bradley 发布的信息来看,iOS 12 绝对不会被支持。

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