`#available`
`#available`는 Swift에서 런타임 시점에 특정 플랫폼 및 버전 조건을 검사하여 실행 흐름을 제어하는 데 사용.
이는 코드가 실행되는 환경이 특정 플랫폼 버전을 지원하는지 확인하고, 지원 여부에 따라 다른 동작을 수행할 수 있게 함.
런타임 조건문으로 동작하며, 주로 API 가용성 검사에 사용.
1. `#available`의 문법
if #available(platformName version, *, ...) {
// 해당 버전 이상에서 실행할 코드
} else {
// 하위 버전에서 실행할 코드
}
주요 구성 요소
- platformName: 플랫폼 이름 (iOS, macOS, watchOS, tvOS 등).
- version: 해당 플랫폼의 최소 지원 버전.
- `*`: 지정되지 않은 다른 플랫폼을 모두 포함.
2. 사용 예시
기본적인 버전 조건 검사
특정 플랫폼과 버전에 따라 조건적으로 실행 코드를 분기.
if #available(iOS 15, *) {
print("iOS 15 이상에서 실행")
} else {
print("iOS 15 미만에서 실행")
}
3. 다중 플랫폼 지원
여러 플랫폼 조합 검사
다른 플랫폼에 대해 조건을 추가할 수도 있음.
if #available(iOS 15, macOS 12, watchOS 8, *) {
print("iOS 15, macOS 12, watchOS 8 이상에서 실행")
} else {
print("해당 버전을 지원하지 않는 플랫폼에서 실행")
}
모든 플랫폼에서 동일한 버전 검사
하위 호환성 코드를 작성할 때 활용.
if #available(*, iOS 15) {
print("모든 플랫폼에서 iOS 15 이상일 때 실행")
}
4. 실제 활용 사례
최신 API 호출
특정 플랫폼에서만 제공되는 최신 API를 안전하게 호출.
if #available(iOS 14, *) {
let formatter = DateFormatter()
formatter.formattingContext = .standalone // iOS 14 이상에서만 사용 가능
}
기본 동작을 보장
지원하지 않는 플랫폼 버전에서도 안정적으로 실행.
if #available(iOS 13, *) {
let stackView = UIStackView()
stackView.axis = .vertical
} else {
print("iOS 13 이전에서는 기본 레이아웃 사용")
}
ViewModifier와의 조합
SwiftUI에서 조건부 수정자를 적용할 때 유용.
struct ContentView: View {
var body: some View {
if #available(iOS 16, *) {
Text("iOS 16 스타일")
.font(.system(size: 20, weight: .bold))
} else {
Text("기본 스타일")
}
}
}
5. `#available`와 `@available`의 차이
`#available` | `@available` | |
사용 위치 | 코드 실행부 (if 문, 조건문) | 선언부 (클래스, 함수, 속성 등) |
용도 | 런타임 시점 조건 검사 | 컴파일 시점 조건 선언 |
예시 | `if #available(iOS 15, *) { ... }` | `@available(iOS 15, *) func myFunc() {}` |
6. 주의사항
- 런타임 검사 오버헤드
- 런타임 시점에 조건을 검사하므로 코드 경량화가 필요할 때 남용하지 않도록 주의.
- 버전별 동작을 명확히 설계
- `else` 구문을 항상 포함하여 하위 버전에서도 예상 가능한 동작을 정의하는 것이 중요.
7. 선택 가이드
사용 사례 | 적합한 조건 |
런타임 시점의 조건부 실행 | 최신 API 또는 플랫폼별 코드 분리 |
호환성 있는 코드 작성 | 하위 플랫폼에서 기본 동작을 제공해야 할 때 |
다중 플랫폼 지원 | 여러 플랫폼에서 공통 조건을 검사해야 할 때 |
8. 결론
`#available`은 런타임 시점에서의 플랫폼 및 버전 조건 검사를 통해 안정적이고 호환성 있는 코드를 작성하는 데 필수적.
최신 API 호출과 기본 동작을 보장하며, 다른 Swift 속성과 조합하여 유연하게 사용할 수 있음.
'Swift' 카테고리의 다른 글
[Swift] JSONEncoder.KeyEncodingStrategy (0) | 2024.06.27 |
---|---|
[Swift] @available (0) | 2024.05.19 |
[Swift] 버전 대응 Wrapper (0) | 2024.05.19 |
[Swift] Property Wrapper (0) | 2024.04.29 |
[Swift] Opaque Type (some 키워드) (0) | 2024.04.19 |