Swift

[Swift] #available

yujaehui 2024. 5. 19. 19:34

`#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. 주의사항

  1. 런타임 검사 오버헤드
    • 런타임 시점에 조건을 검사하므로 코드 경량화가 필요할 때 남용하지 않도록 주의.
  2. 버전별 동작을 명확히 설계
    • `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