@available(macOS, introduced: 12.0, backDeployedTo: 11.0)
This form does look nicer in isolation. But let's be clear about what it will mean in practice. Currently, an API declaration uses a shorthand declaration availability form like this:
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
func example()
That multi-platform syntax is not available if you're adding additional parameters, so it would have to look like this instead:
@available(macOS, introduced: 12.0, backDeployedTo: 11.0)
@available(iOS, introduced: 15.0, backDeployedTo: 14.0)
@available(tvOS, introduced: 15.0, backDeployedTo: 14.0)
@available(watchOS, introduced: 8.0, backDeployedTo: 7.0)
func example()
On the other hand, the original proposal would give us this spelling:
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
@backDeploy(before: macOS 12.0, iOS 15.0, tvOS 15.0, watchOS 8.0)
func example()
Putting it directly into the @available attribute is easy to understand in isolation, but causes an explosion of attributes in common cases. I'd be interested in exploring ways we can make the spelling clear without multiplying the number of attributes we need.