Swift는 주어진 타겟에서 사용 불가능한 API를 실수로 사용하는 것을 막기위해 사용 가능한 API 확인 (checking API availability)을 제공한다.
컴파일러는 사용된 API가 프로젝트에 특정 타겟에서 사용 가능한지 확인하기 위해 SDK 안에 사용 가능한 정보를 사용한다. Swift는 사용 불가능한 API에 대해 컴파일 시 에러를 발생시킨다.
사용하려는 API를 런타임에 사용할 수 있는지 여부에 따라 if 또는 guard 구문에서 가용성 조건 (availability condition) 을 사용하여 코드 블럭을 조건부로 실행한다.
컴파일러는 해당 코드 블럭의 API를 사용할 수 있는지 확인할 때 가용성 조건의 정보를 사용한다.
if #available(iOS 10, macOS 10.12, *) {
// Use iOS 10 APIs on iOS, and use macOS 10.12 APIs on macOS
} else {
// Fall back to earlier iOS and macOS APIs
}
iOS에서 위의 특정 가용성 조건의 if 구문의 본문은 iOS 10 이상 버전에서만 실행되고 macOS에서는 macOS 10.12 이상 버전에서만 실행된다.
마지막 인수 * 는 필수이며 다른 플랫폼에서 if 의 본문이 최소 타겟 버전에서 실행되도록 지정한다.
일반적인 형식에서 가용성 조건은 플랫폼 이름 및 버전 리스트를 사용한다.
iOS, macOS, watchOS, tvOS 와 같은 플랫폼 이름을 사용하며, iOS 8 또는 macOS 10.10과 같은 메이저 버전 번호를 지정하는 것 외에 iOS 11.2.6과 macOS 10.13.3과 같은 마이너 버전 번호로 지정할 수 있다.
if #available(<#platform name#> <#version#>, <#...#>, *) {
<#statements to execute if the APIs are available#>
} else {
<#fallback statements to execute if the APIs are unavailable#>
}
guard 구문과 함께 가용성 조건을 사용할 때 이것은 코드 블럭에서 나머지 코드에 대한 가용성 정보를 구체화한다.
@available(macOS 10.12, *)
struct ColorPreference {
var bestColor = "blue"
}
func chooseBestColor() -> String {
guard #available(macOS 10.12, *) else {
return "gray"
}
let colors = ColorPreference()
return colors.bestColor
}
위의 예제에서 ColorPreference 구조체는 macOS 10.12 이상을 요구한다.
chooseBestColor() 함수는 가용성 가드로 시작한다. 플랫폼 버전이 ColorPreference 를 사용하기에 너무 예전 버전이면 항상 사용 가능한 동작으로 대체된다. guard 구문 이후는 macOS 10.12 이상 버전을 요구하는 API 를 사용할 수 있다.
#available 이외에도 Swift 는 비가용성 조건을 사용하여 반대로 확인할 수도 있다.
예를 들어, 아래의 내용은 동일한 내용을 확인한다.
if #available(iOS 10, *) {
} else {
// Fallback code
}
if #unavailable(iOS 10) {
// Fallback code
}
#unavailable 를 사용하는 형식은 대체 코드만을 포함할 때 더 읽기 쉬운 코드로 만들어 준다.