Checking API Availability in Swift

In a previous article I explained how to set up your Xcode projects to support older versions of iOS and macOS. But I didn’t explain how to use new functions on new iOS and macOS versions and older functions on older systems.

Swift provides two statements to help support older OS versions: #available and @available.

#available

The #available keyword works with if and guard statements. Supply an operating system version version, and the code inside the if block runs only on suitable systems.

Let’s work through an example. Apple added the NSPersistentContainer class in iOS 10 and macOS 10.12 to simplify setting up the Core Data stack. You would like to use NSPersistentContainer on systems that have the class and not use it on older versions of iOS and macOS. The following example shows how to use NSPersistentContainer on systems running iOS 10 and later:

The asterisk as the second argument to #available tells the compiler to require the minimum deployment target for other platforms. The minimum deployment target is the earliest version of iOS or macOS that can run your app.

The following code shows how to use NSPersistentContainer on systems running macOS 10.12 and later:

Apple added the #available statement before changing the name of the Mac operating system from OS X to macOS.

If you have some code that should run only on later versions of iOS or macOS, use #available with a guard statement. By using #available with guard, your code can exit if it’s running on an older version of iOS or macOS.

@available

Place @available in front of a function or class to make that function or class available only on supported iOS and Mac versions. Like #available, supply an operating system version. The following code shows how to use @available with a function:

The following code uses @available with a class: