앱을 개발하다보면 기기의 OS버전별로 구문을 나누어 작성해야할 경우가 종종있다. 사용하고자 하는 기능이 OS 버전에 따라 다르게 제공되거나 하위 버전에서는 지원되지 않는 것이 가장 큰원인인데 이를 보통 "API가 버전을 탄다"라고 표현한다.
애플에서 제공하는 코코아 터치 프레임워크의 주요 API들은 대부분 iOS 버전이 업그레이드될 때마다 개량을 거듭하기 때문에 iOS 버전에 따라 종종 사용이 제한되기에, 특정 API를 사용할 때엔 애플 개발자용 API 문서를 확인해 사용 가능한 OS버전과 기기를 꼭 체크해야한다.
이 때 유용하게 사용되는 구문이 #available 구문인데 먼저 이 구문을 사용하지 않을 경우를 살펴보자.(참고로 #available 구문은 스위프트 2 버전부터 지원하기 시작한 구문이다.)
import UIKit
if (UIDevice.current().systemVersion.hasPrefix("9")) {
// iOS 9 버전에서 지원하는 구문
} else if (UIDevice.current().systemVersion.hasPrefix("8")) {
// iOS 8 버전에서 지원하는 구문
} else if (UIDevice.current().systemVersion.hasPrefix("7")) {
// iOS 7 버전에서 지원하는 구문
} else {
// 기타 나머지 버전에서 지원하는 구문
}
크게 문제가 있는 것은 아니지만, 버전을 직접 비교하는게 아니라 버전의 문자열을 비교해야해서 비교의 한계가 있는 것이 사실이다. 또한 문법이 길어 복잡해보인다는 점이 단점으로 존재한다.
다음은 #available 구문에 대해 살펴보자.
if #available <플랫폼이름 버전>, <...>, <*> {
<해당 버전에서 사용할 수 있는 API 구문>
} else {
<API를 사용할 수 없는 환경에 대한 처리>
}
#available 구문을 사용할 때엔 호출 연산자()를 통해 플랫폼 이름과 버전 등의 인자값을 입력할 수 있는데, 이 때 플랫폼 이름과 버전 사이는 공백으로 구분한다. 또한 구문의 인자값은 가변 인자로 정의되어 있기 때문에 입력 개수에 제한이 없다. 버전값의 나열이 끝나면 마지막은 *로 마감해 인자값 입력이 끝났음을 선언하고 괄호를 닫아주면 된다.
#available 구문을 실제로 적용한 예제를 살펴보자.
if #available(iOS 9, OSX 10.10, watchOS 1, *) {
// iOS 9용 API 구문 또는 OSX 10.10용 API 구문 또는, watchOS 1용 API구문
} else {
// API를 사용하지 못했을 때에 대한 실패처리
}
최신 버전을 기준으로 작성할 때엔 이를 지원하지 않는 구 버전 사용자를 위한 else 처리도 반드시 잊지 말아야한다.
현재 #available구문을 사용할 법한 플랫폼은 다음이 거의 전부이다.
- 아이폰, 아이패드 등 터치 기반 스마트 기기에 사용되는 iOS
- 맥 컴퓨터에 사용되는 OSX
- 애플 시계에 사용되는 watchOS
- 애플 TV에 사용되는 TvOS
실제로 사용하고자 하는 API가 어느 버전에서 사용할 수 있는지 아닌지에 대해 확인하는 것은 반드시 이루어져야할 작업이다. 특히 최신 API를 사용할 때엔 항상 #available 구문을 사용해 코드를 분리하고, 하위 버전 사용자를 위한 처리까지 해주어야한다.
참고 : 꼼꼼한 재은씨의 Swift 문법편
'Swift > 문법' 카테고리의 다른 글
스위프트(Swift) - 제어 전달문(Control Transfer Statements) (0) | 2022.05.04 |
---|---|
스위프트(Swift) - 조건문 Ⅳ. switch 구문 (0) | 2022.05.03 |
스위프트(Swift) - 조건문 Ⅱ. guard 구문 (0) | 2022.04.30 |
스위프트(Swift) - 조건문 Ⅰ. if 구문 (0) | 2022.04.29 |
스위프트(Swift) - 반복문 Ⅱ. while 구문 (0) | 2022.04.28 |