Availability Attribute

The @available attribute. Not the #available attribute.

The @available attribute is used to denote the availability of a given class/struct or method.

In the simplest form, we can use it to denote that a component is available starting at a given OS version:

@available(iOS 15, *)
class MyClass {} // MyClass is only available on iOS 15 and above.

If you try to use MyClass in an app targeting iOS 14 or lower, you’ll get a compiler error, and get asked to wrap the section that uses it in a #available check.

You can specify other platforms and versions as well, the following are available:

  • iOS
  • iOSApplicationExtension
  • macOS
  • macOSApplicationExtension
  • macCatalyst
  • macCatalystApplicationExtension
  • watchOS
  • watchOSApplicationExtension
  • tvOS
  • tvOSApplicationExtension
  • swift (e.g. specifying the version of swift this component requires)

Deprecating & Obsoleting

You can mark a component as deprecated by specifying the deprecated argument (which takes an optional version number). Similarly, you can also specify when it was obsoleted by specifying the obsoleted argument (which also takes an optional version number). Using a deprecated component will trigger a compiler warning when targeting the version the component was deprecated on (or all, if you specified deprecated: *), while using an obsoleted component will trigger a compiler error when targeting the version the component was obsoleted on.

@available(iOS, deprecated: 13, obsoleted: 14)
class MyDeprecatedAndObsoletedComponent {}

@available(*, deprecated)
class MyDeprecatedComponent {}

Message and Replacement

You can also have the compiler present a custom message as the error, and even provide a nice fix-it button if you have simply renamed it.. Use the message argument to provide a message, and a renamed argument for a new component to replace it with.

@available(*, obsoleted, renamed: "MyNewComponent")
struct MyOldComponent {}
@available(*, obsoleted, message: "Use MyNewComponent with some other component.")
struct MyOldComponent {}

Last updated: 2021-12-05 09:18:21 -0800