🔥 API 사용 가능성 확인하기

422자
5분

Swift에는 API 사용 가능성을 확인하는 기능이 내장되어 있습니다. 이를 통해 개발자는 특정 배포 대상에서 사용할 수 없는 API를 실수로 사용하는 일을 방지할 수 있죠.

컴파일러는 SDK의 사용 가능성 정보를 활용하여 프로젝트에서 지정한 배포 대상에서 코드에 사용된 모든 API를 사용할 수 있는지 확인합니다. 만약 사용할 수 없는 API를 사용하려고 하면 Swift는 컴파일 시점에 오류를 보고하게 됩니다.

if문이나 guard문에서 사용 가능성 조건을 사용하여 런타임에 사용하려는 API를 사용할 수 있는지에 따라 코드 블록을 조건부로 실행할 수 있습니다. 컴파일러는 사용 가능성 조건의 정보를 사용하여 해당 코드 블록의 API를 사용할 수 있는지 확인합니다.

if #available(iOS 10, macOS 10.12, *) {
    // iOS에서는 iOS 10 API를, macOS에서는 macOS 10.12 API를 사용합니다.
} else {
    // 이전 버전의 iOS와 macOS API로 대체합니다.
}
swift

위의 사용 가능성 조건은 iOS에서는 iOS 10 이상에서만, macOS에서는 macOS 10.12 이상에서만 if 문의 본문이 실행되도록 지정합니다. 마지막 인수 *는 필수이며, 다른 플랫폼에서는 대상에 지정된 최소 배포 대상에서 if 문의 본문이 실행됨을 지정합니다.

사용 가능성 조건의 일반적인 형태는 플랫폼 이름과 버전의 목록을 가집니다. iOS, macOS, watchOS, tvOS와 같은 플랫폼 이름을 사용하며, 전체 목록은 선언 특성을 참조하세요. iOS 8이나 macOS 10.10과 같은 주요 버전 번호 외에도 iOS 11.2.6 및 macOS 10.13.3과 같은 부 버전 번호를 지정할 수 있습니다.

if #available(<#platform name#> <#version#>, <#...#>, *) {
    <#API를 사용할 수 있는 경우 실행할 구문#>
} else {
    <#API를 사용할 수 없는 경우 실행할 대체 구문#>
}
swift

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
}
swift

위의 예에서 ColorPreference 구조체는 macOS 10.12 이상이 필요합니다. chooseBestColor() 함수는 사용 가능성 가드로 시작됩니다. 플랫폼 버전이 ColorPreference를 사용하기에 너무 오래된 경우 항상 사용 가능한 동작으로 대체됩니다. guard 문 이후에는 macOS 10.12 이상이 필요한 API를 사용할 수 있습니다.

Swift는 #available 외에도 불가능성 조건을 사용하여 반대 확인을 지원합니다. 예를 들어 다음 두 가지 확인은 같은 작업을 수행합니다.

if #available(iOS 10, *) {
} else {
    // 대체 코드
}
 
if #unavailable(iOS 10) {
    // 대체 코드
}
swift

#unavailable 형식을 사용하면 확인에 대체 코드만 포함된 경우 코드를 더 읽기 쉽게 만들 수 있습니다.

API 가용성 확인 기능을 활용하면 다음과 같은 장점이 있습니다:

  1. 배포 대상에서 지원하지 않는 API 사용을 방지하여 런타임 오류를 줄일 수 있습니다.
  2. 컴파일 시점에 API 호환성 문제를 파악할 수 있어 개발 효율성이 높아집니다.
  3. 코드의 가독성과 유지보수성이 향상됩니다.

따라서 API 가용성 확인은 Swift 개발에 있어 중요한 기능 중 하나라고 할 수 있겠네요.