티스토리 뷰
안녕하세요 :) Zedd입니다.
연말..잘보내시고 계신가요?! :0
저는 태어나서 가장 바쁜 연말을 보내고 있는 것 같아요..!!! 하핳
제가 개념을 좀 확실히 모르고 있는거 같아서..오늘은 available에 대해서 공부해보려고 해요.
available
음..제목이 available로 하는게 맞는건지.. 잘 모르겠지만 일단 하겠습니다.
일단 빠질 수 없는 공식문서 ㅋ.ㅋ
available을 사용하여 특정 Swift언어 버전 또는 특정 플랫폼 및 OS버전과 관련된 선언의 수명주기(lifecycle)를 나타냅니다.
사용가능한 속성(attribute)은 항상 두개이상의 쉼표로 구분된 attribute argument목록과 함께 나타납니다.
이러한 argument는 다음 플랫폼 또는 언어 이름 중 하나로 시작합니다.
iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
watchOS
watchOSApplicationExtension
tvOS
tvOSApplicationExtension
swift
*(별표)를 사용하여 위에 나열 된 모든 플랫폼 이름에 대한 선언의 가용성(availability)을 나타낼 수도 있습니다. Swift버전 가용성을 지정하는 사용가능한 attribute는 *를 사용할 수 없습니다.
나머지 argument는 순서에 관계없이 나타날 수 있으며, 중요한 milestones를 포함하여, 선언의 수명주기에 대한 추가 정보를 지정 할 수 있습니다.
● unavailable는 지정된 플랫폼에서 선언을 사용할 수 없음을 나타냅니다. 이 argument는 Swift버전 가용성을 지정할 때 사용 할 수 없습니다.
● introduced는 선언이 도입 된 지정된 플랫폼 또는 언어의 첫번째 버전을 나타냅니다.
- introduced: version number
버전번호는 1~3개의 양의 정수로 구성되며, 마침표로 구분됩니다.
● deprecated는 선언이 사용되지 않는 지정된 플랫폼 또는 언어의 첫번째 버전을 나타냅니다.
deprecated: version number
optional 버전번호는 1~3개의 양의 정수로 구성되며, 마침표로 구분됩니다. 버전 번호를 생략하면, 해당 선언이 더이상 사용되지 않으므로 정보는 제공되지않습니다.
버전번호를 생략하면, :(콜론)도 생략하세요.
● obsoleted는 선언이 폐기된 지정된 플랫폼 또는 언어의 첫번째 버전을 나타냅니다.
선언이 obsoleted로 지정되면, 지정된 플랫폼 또는 언어에서 제거되고, 더 이상 사용할 수 없습니다.
- obsoleted: version number
버전번호는 1~3개의 양의 정수로 구성되며, 마침표로 구분됩니다.
- message: message
메세지는 문자열 리터럴로 구성됩니다.
● renamed는 이름이 바뀐 선언의 새 이름을 나타내는 텍스트 메세지를 제공하는데 사용됩ㄴ디ㅏ.
새로운 이름은, 이름이 바뀐 선언의 사용에 관헤 오류를 낼 때 컴파일러에 의해 표시됩니다.
renamed: new name
새 이름은 문자열 리터럴로 구성됩니다.
자..그럼 써볼까요?
아..그전에!!!
#available과 @available과 의 차이점을 먼저 보고 갈게요.
#available
#available은..많이 보셨을거에요!
if #available(iOS 11.0, *) {
// do something.
} else {
// do something.
}
이런거요.
#available은 여러 플랫폼에서 서로 다른 논리 처리를 결정하기 위해서 if 또는 guard문과 같이 사용됩니다.
즉, Bool을 반환하는 런타임 검사에요.
*은 필수입니다!
주의할 점은, 해당 버전을 포함하여 "그 이상의 버전"인지를 확인하는거에요. 그러니까
if #available(iOS 11.0, *) {
// iOS 11, 12
} else {
// iOS 11, 12가 아닌 다른 버전들.
}
가 되는 것이죠.
그럼 타입은? 메소드를 버전또는 플랫폼 별로 제한 할 수 없을까요?
그럴때 바로 @available을 사용합니다.
@available
@available은 함수(메소드), 클래스 또는 프로토콜 앞에 놓입니다! 타입 또는 프로토콜이 적용되는 플랫폼 및 OS를 나타내요. 이건 deployment target과 관련이 깊습니다. #available과 다르게, 컴파일타임에 경고 또는 오류를 생성합니다.
@available(iOS 12, *)
func setupDoneButton() { }
이런거요. 이렇게 되면 iOS12를 포함한 그 이상의 버전에서만 setupDoneButton을 호출 할 수 있습니다.
근데!!! 만약 내 deployment target이 10이다?
그러면
if #available(iOS 12, *) {
self.setupDoneButton()
} else {
// Fallback on earlier versions
}
이렇게 호출 할 수 밖에 없죠.
이렇게 하나의 플랫폼에서만 체크할수도 있지만, 여러개도 가능해요!
@available(iOS 10.0, macOS 10.12, *)
func setupDoneButton() { }
이런식으로..
자. 차이점을 아셨나요?
그럼 위에서 말한 unavailable, introduced...등등을 써봅시다.
저것들은 모두 @available안에 들어가는 것들이에요.
써봅시다.
unavailable
@available(*, unavailable)
func setupDoneButton() { }
자..위에서 *은 "*(별표)를 사용하여 위에 나열 된 모든 플랫폼 이름에 대한 선언의 가용성(availability)을 나타낼 수도 있습니다. "라고 그랬죠?
그럼 setupDoneButton()은 모~~~든 플랫폼에서 unavailable하다는 뜻입니다.
사용하려고 하면, 이렇게 오류를 띄우게 됩니다. 물론 컴파일타임에요.
메세지도 같이 줄 수 있습니다.
@available(*, unavailable, message: "2018년아 가지마 ㅠ")
func setupDoneButton() { }
이렇게 하면
이렇게 옆에 내 메세지가 같이 나옵니다.
*가 아니라 플랫폼을 지정해주면?
@available(macOS, unavailable)
func setupDoneButton() { }
이렇게 하면 macOS에서는 사용 할 수 없는 메소드인거죠?
introduced.
@available(*, introduced: 12.0)
func setupDoneButton() { }
자, 이건 뭔가 동작이 이해가 안가는데
*은 모든 플랫폼인데..Swift는 4.2자너,,
암튼 위에 처럼 해주면,
setupDoneButton은 12.0에서 도입됐다!!! 라는 거니까 12.0이상에서만 쓸 수 있겠죠?
deprecated.
deprecated은 보니까 현재. deployment target이랑 관련이 있는것 같아요.
현재 deployment target "이하"면 경고가 뜨는 것 같습니다.
@available(*, deprecated: 10.0, message: "ㅋㅋ")
메세지도 추가 가능.
초과면 뜨지 않는 것 같아요.
메세지도 추가 가능하지만, renamed도 추가 가능합니다.
@available(*, deprecated: 10.0, renamed: "제드짱")
이케
obsoleted.
obsoleted은 폐기랑 관련이 있었죠? 이것도 deployment target이랑 관련이 있는것 같아요. 역시나 deprecated처럼 현재 deployment target "이하"면 에러가 뜹니다. deprecated는 경고였지만... obsoleted는 에러가 뜬당.
@available(swift, obsoleted: 4.2)
자..이렇게 플랫폼을 지정 할 수도 있는데요, 역시나 현재 Swift버전 "이하"면 에러가 뜹니다.
지금 프로젝트 Swift 버전이 4.2상태라면 에러가 나겠죠? 4.3으로 해야 에러가 안남;
하지만 4.3이 폐기를 시작할 버전이니까 4.3에서부터는 에러가 뜨겠죠?
마지막으로 최종보스.
@available(swift, deprecated: 4.0, obsoleted: 5.0, message: "This will be removed in v5.0; please migrate to a different API.")
deprecated와 obsoleted같이쓰기! deprecated는 4.0부터 되었고(아직까지는 컴파일 됨), 근데 5.0부터는 아예 폐기되어서 에러가 날거니까 다른걸로 바꿔라~~~라고 경고를 줄 수 ㄷ있겠죠.
암튼 이런식으로 쓸 수 있다는 거 ㅎㅎㅎㅎ
지금 다 메소드 앞에서만 썼지만, 클래스나 프로토콜 앞에서도 @available을 똑같이 쓸 수 있습니다!
핳하
암튼 진짜로 올해 마지막 iOS글이 될 거 같고 내년까지 놀거임
아 31일에 결산글 한번 쓰겠네요
모두 행복한 연말 되세요 ~_~
'iOS' 카테고리의 다른 글
iOS ) Task Management - Activity Sharing (0) | 2019.01.19 |
---|---|
iOS ) Handoff 사용해보기 (1) | 2019.01.17 |
iOS ) Text Input Traits (3) | 2018.12.10 |
iOS ) Advanced Text Layouts and Effects with Text Kit (1) | 2018.12.01 |
iOS ) Task Management - Scheduling - Timer (0) | 2018.11.30 |
- Git
- swift delegate
- 피아노
- 제이슨 파싱
- Accessibility
- UIBezierPath
- np-complete
- WKWebView
- FLUTTER
- iOS delegate
- Swift
- actor
- fastlane
- 회고
- swift3
- ios 13
- swift sort
- Xcode
- SwiftUI
- Combine
- swift 공부
- github
- WidgetKit
- 스위프트 문법
- WWDC
- IOS
- swift array
- swift tutorial
- 스위프트
- np-hard
- Total
- Today
- Yesterday