본문 바로가기
iOS와 그 외/Swift

[Swift] @available, @available(*, unavailable), #available 사용하기

by lody.park 2024. 1. 3.

 

안녕하세요 🎵 Lody 입니다. 오늘은 @available, @available(*, unavailable), #available 에 대해 정리해보겠습니다 

 

@available

@available 은 Swift 프로그래밍 언어에서 제공되는 기능입니다. 이 어노테이션은 Swift 언어의 일부로, Swift의 표준 라이브러리에 포함되어 있습니다.

 

주로 Apple의 플랫폼들, 즉 iOS, macOS, watchOS, tvOS 등에서 사용됩니다. 다양한 버전의 운영체제에서 실행되는 어플리케이션의 호환성을 관리할 때 @available 어노테이션을 활용할 수 있습니다.

 

@available 을 통해 개발자는 특정 클래스, 메서드, 프로퍼티 등이 특정 버전의 OS에서 사용 가능한지 여부를 명시할 수 있습니다.

 

가령 iPadOS 의 도입과 함께 생겨난 SceneDelegate의 경우 iOS 13 이상에서만 사용할 수 있습니다.

SceneDelegate를 사용하는데, Deployment 최소 타깃이 iOS 12 이하이면 ... 빌드시에 어떻게 될까요?

 

iOS 12 버전 이하에서는 SceneDelegate의 개념 자체가 존재하지 않으니 당연히 에러가 발생합니다.

 

이런 경우에 @available을 이용할 수 있습니다.

아래와 같이 iOS13 이상에서만 SceneDelegate를 사용할꺼예요 ~! 라고 상단에 명시해준다면, 빌드가 잘 됩니다.

 

@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
	// 생략
}

 

이 처럼 @available 어노테이션은 API의 버전관리와 조건부 코드실행에 활용할 수 있습니다.

 

 

@available(*, unavailable) 외 기타 옵션들

앞에서 특정 버전에서 이용가능하다는 것을 명시하기 위해 @available 어노테이션을 사용했습니다. 반대로 특정 버전에서는 사용 불가능함을 명시하기 위해 사용하는 것이 @available(*, unavailable) 입니다.

 

@available 은 unavailable 뿐만 아니라 다양한 옵션을 통해 특정 API의 사용 가능성을 세밀하게 제어할 수 있습니다. 이 옵션들은 API 가 특정 버전에서 도입되었거나 사용이 중단되었음을 나타내거나, 특정 플랫폼에서 사용할 수 없음을 명시하는 데 사용됩니다. 각 각을 아래 표로 정리해보았습니다 ~!

옵션 설명
unavailable 이 옵션은 해당 기능이 더 이상 사용할 수 없음을 나타냅니다. 특정 플랫폼 또는 버전에서 API가 사용 불가능하다는 것을 명시할 때 사용됩니다.
introduced 특정 버전에서 API가 도입되었음을 나타냅니다. 이를 통해 개발자는 API가 처음 사용 가능해진 버전을 지정할 수 있습니다.
deprecated API가 더 이상 권장되지 않음을 나타냅니다. 이 옵션은 특정 버전부터 API 사용을 권장하지 않지만 아직 사용할 수 있음을 의미합니다.
obsoleted 이 옵션은 API가 특정 버전에서 완전히 사용 중단되었음을 나타냅니다. 이는 deprecated 보다 강력한 옵션으로, API가 더 이상 작동하지 않음을 의미합니다.
message API가 deprecated 또는 obsoleted인 경우, 이 옵션을 사용하여 개발자에게 추가 정보나 대체 권장 사항을 제공할 수 있습니다.
renamed API의 이름이 변경되었음을 나타냅니다. 이 옵션은 개발자가 사용하려는 API가 새로운 이름으로 변경되었을 때 유용합니다.

 

다음과 같이 사용할 수 있습니다.

@available(iOS, introduced: 9.0, deprecated: 10.0, obsoleted: 11.0, renamed: "새로운 메서드 이름", message: "새로운 메서드를 대신 사용하세용")
func 레거시한_메서드() {
    // 메서드 구현부
}

 

 

#available

#available 은 조건문 분기가 가능합니다.

if #available(iOS 13, *) {
  // 13 이상 버전 코드
}
else {
  // 13 미만 버전 코드
}

 

 

부록) @ 과 # 의 차이점 알기

@available과 #available을 알아보았습니다.

 

@와 #를 구분할 수 있어야합니다. 

 

@ 기호는 Swift Attribute를 나타냅니다. 이는 클래스, 메서드, 속성 등에 추가 정보를 제공하는 선언입니다. 선언부 상당에 명시해줄 수 있습니다. Swift Attribute 컴파일러에게 추가적인 지시를 제공하며, 코드의 실행 방식에 영향을 줄 수 있습니다.

 

반면 # 기호는 컴파일러 지시문(compiler directives)을 나타냅니다. 

Swift의 컴파일러 지시문은 코드의 특정 부분이 특정 조건에서만 컴파일 되거나 실행되도록 지시합니다. Swift 컴파일러에 의해 내부적으로 처리됩니다. 런타임이나 컴파일 시의 조건을 기반으로 동작합니다. 예를 들어 #available은 특정 OS버전에서 코드가 실행되는지 확인합니다.

 

주의!!! Swift의 컴파일러 지시문과 다른 프로그래밍 언어의 전처리기 지시문은 다른 개념을 지니고 있습니다. 이 차이점을 명확하게 이해할 필요가 있습니다.

 

 

참고: 

https://eunjin3786.tistory.com/323

 

[iOS] XCode Build System 이해하기

Understanding Xcode Build System 이라는 포스팅을 읽었는데 대학생때 배웠던 Compile Process (전처리기 -> 컴파일러 -> 어셈블러 -> 링커) 에 여기저기서 주워들은(?) llbuild, SIL, clang 등 Xcode Build 관련 용어들이

eunjin3786.tistory.com

https://developer.apple.com/documentation/xcode/running-code-on-a-specific-version

 

Running code on a specific platform or OS version | Apple Developer Documentation

Add conditional compilation markers around code that requires a particular family of devices or minimum operating system version to run.

developer.apple.com

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

 

Documentation

 

docs.swift.org