@available은 Swift에서 API의 사용 가능 여부를 선언하는 속성(attribute)이다.
이 속성을 사용하면 특정 플랫폼, 버전, 또는 전체 플랫폼에서 사용 가능/불가능 여부를 명시할 수 있다.
@available(platform version, *, message: "Optional message")
platform: iOS, macOS, watchOS, tvOS 등version: 해당 플랫폼에서 사용 가능한 최소 버전*: 모든 플랫폼에 적용됨을 의미message: 사용자가 API를 쓸 때 나타나는 안내 메세지| 키워드 | 설명 |
|---|---|
@available(...) | 해당 조건에 따라 사용 가능 |
@available(*, unavailable) | 모든 플랫폼에서 사용 불가 |
@available(..., deprecated) | 사용은 가능하지만 권장되지 않음(경고 발생) |
@available(..., obsoleted) | 완전히 사용 불가 (컴파일 에러 발생) |
@available(iOS 15, *)
func doSomethingNew() {
// iOS 15 이상에서만 사용 가능
}
@available(iOS, deprecated: 14.0, message: "Use newAPIMethod() instead")
func oldMethod() {
// 여전히 작동하지만 경고 표시
}
@available(*, unavailable, message: "Use init(title:) instead")
init() {
fatalError("Use designated initializer")
}
@available(iOS 14, macOS 11, *)
func sharedFeature() {}
if #available)Swift에서 UIView를 상속해서 커스텀 뷰를 만들 때, 직접 init(frame:)이나 커스텀 이니셜라이저를 정의하려고 하면 Swift는 반드시 required init?(coder:)도 구현하라고 요구한다.
이건 Interface Builder(스토리보드, XIB 등)에서 인스턴스를 만들 때 필요한 이니셜라이저이기 때문이다.
하지만 스토리보드를 사용하지 않는다면 이 이니셜라이저는 절대 호출되지 않기 때문에, @available을 사용하여 해당 이니셜라이저가 사용되는 것을 막을 수 있다.
@available(*, unavailable) // 모든 플랫폼에서 사용 불가
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
fatalError는 런타임 시점에서 중단하기 때문에 이보다 강력함이번에 다른 개발자가 required init?(coder:)에 @available을 활용하는 코드를 보고 왜 사용하는 것인지 의문이 생겨서 @available에 대해 공부를 해보았는데, 생각보다 활용할 수 있는 범위가 넓은 것 같아서 큰 도움이 되었다.
특히 버전별로 관리하거나 플랫폼 별로 관리를 할 수 있다는 점이 인상 깊었는데, 앞으로 프로젝트를 할 때도 유용히 사용할 수 있을 것 같다.