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

I have an app which deployment target is iOS 12.1, with many protocols defining functions with completion handlers, i.e.

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

I would like to replace all these with the new async/await iOS 15 syntax, for a better code readability:

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

But when doing so, I get the error:

Concurrency is only available in iOS 15.0.0 or newer

What is a good solution for this, considering that I just cannot switch the deployment target from 12.1 to 15.0?

Thank you for your help


Solution 1:

The short answer is "there is currently no solution." If you want your apps to run on iOS 12 and earlier, you can't use the async/await calls, unless you want to write 2 versions of all your async code, one that runs on iOS < 15, and the other that runs on iOS ≥ 15.

As George mentions in his comment, Apple is trying to figure out how to "back-depoloy" async/await support. If they are able to do that, you will be able to use the modern approach with older versions, but I would bet Apple will not go back as far as iOS 12.

Edit:

See Bradley's comment below. The best you will get is async/await support in iOS 13, if Apple is able to pull that off. From the link Bradley posted, iOS 12 definitely won't be supported.