Swift

@available

Phililip
728x90

안녕하세요.

 

이번엔 Swift의 @available 속성에 대해서 알아볼게요.

 


available 속성을 사용하면 특정 Swift 버전이나 특정 플랫폼 및 os 버전과 관련된 선언 lifecycle을 나타낼 수 있어요.

 

## Arguments

available은 2개 이상의 인자가 필요해요.

 

인자는 다음 중 하나의 플랫폼 또는 언어 이름으로 시작합니다.

- iOS
- iOSApplicationExtension
- macOS
- macOSApplicationExtension
- macCatalyst
- macCatalystApplicationExtension
- watchOS
- watchOSApplicationExtension
- tvOS
- tvOSApplicationExtension
- visionOS
- swift

 

모든 플랫폼 대상으로 선언하고 싶으면 asterisk(*)를 사용해도 괜찮아요.

[주의] Swift 인자를 사용한 available 속성에서는 asterisk(*)를 사용할 수 없습니다.

 

나머지 인자들은 순서에 상관없이 조합해서 쓸 수 있어요.

 

나머지 인자들에 대해 알아볼게요.

 

### unavailable

선언한 플랫폼에서 사용할 수 없음을 나타냅니다.

[주의] Swift 인자를 사용한 availability 속성에선 이 인자를 사용할 수 없습니다.

 

위처럼 선언하면 iOS 플랫폼에선 MyClass 클래스를 사용할 수 없고 컴파일 에러가 발생합니다.

 

 

### introduced

클래스나 method가 처음으로 도입된 플랫폼 또는 Swift 버전을 의미합니다.

 

버전 정보는 점(.)으로 구분된 1~3개 0 이상의 정수로 구성됩니다. (ex. 16.0.1)

 

위처럼 선언하면 MyClass가 iOS 17.0.0부터 도입되었다는 것을 의미하기 때문에 17.0.0 이하도 지원하는 프로젝트의 경우 아래와 같은 컴파일 에러가 발생하기 때문에 'if #available' 구문으로 분기처리를 해줘야 합니다.

 

introduced 인자만 사용하고 여러 플랫폼을 지원하는 경우, 아래처럼 생략해서 사용할 수도 있어요.

 

 

### deprecated

deprecated 되었을 때 사용하는 인자입니다.

 

버전 정보는 입력할 수도 있고 생략할 수도 있습니다.

(언제부터 deprecated 되었는지에 대한 정보를 제공하고 싶지 않을 때 버전 정보를 생략합니다.)

 

deprecated 인자를 사용하면 위처럼 경고 메시지가 나옵니다.

 

### obsoleted

선언(클래스, 구조체, method 등)이 특정 플랫폼 또는 Swift 버전에서 처음으로 폐기되었을 때 사용합니다.

 

위처럼 폐기되었다고 선언하면 컴파일 에러가 발생합니다.

 

### message

deprecated 되었거나 obsoleted 된 선언들에 대해서 컴파일러가 경고나 에러를 출력할 때 보여줄 메시지입니다.

 

 

### renamed

선언명이 변경되었을 때 어떤 명칭으로 변경되었는지 표시할 때 사용합니다.

 

예를 들어서 최초에 MyProtocol로 배포를 했는데

 

나중에 MyProtocol -> MyRenamedProtocol로 이름이 바뀐 경우, typealias와 함께 사용해서 컴파일러에서 경고 또는 에러 메시지와 함께 자동완성될 수 있도록 활용할 수 있어요.

 

 

 

## 기타

특정 플랫폼 가용성과 swift 버전은 같이 지정할 수 없어요.

 

이럴 땐 아래처럼 available 속성을 2번 사용하면 됩니다.

 

 

# 참고

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/attributes/#available

 

Documentation

 

docs.swift.org

 


이번 글은 여기서 마무리.

 

 

 

반응형

'Swift' 카테고리의 다른 글

구조체(value type) 생성자에 대해 알아보자  (0) 2024.01.17
private(set)  (0) 2024.01.17
@testable  (0) 2023.11.21
Dictionary Enum.rawValue subscript  (0) 2023.08.08
Opaque and Boxed Types  (0) 2023.07.01