티스토리 뷰

iOS

iOS ) available

Zedd0202 2018. 12. 21. 18:37
반응형

안녕하세요 :) 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는 선언이 도입 된 지정된 플랫폼 또는 언어의 첫번째 버전을 나타냅니다. 

  1. introduced: version number

버전번호는 1~3개의 양의 정수로 구성되며, 마침표로 구분됩니다.


● deprecated는 선언이 사용되지 않는 지정된 플랫폼 또는 언어의 첫번째 버전을 나타냅니다.

deprecated: version number


optional 버전번호는 1~3개의 양의 정수로 구성되며, 마침표로 구분됩니다. 버전 번호를 생략하면, 해당 선언이 더이상 사용되지 않으므로 정보는 제공되지않습니다.

버전번호를 생략하면, :(콜론)도 생략하세요.


● obsoleted는 선언이 폐기된 지정된 플랫폼 또는 언어의 첫번째 버전을 나타냅니다. 

선언이 obsoleted로 지정되면, 지정된 플랫폼 또는 언어에서 제거되고, 더 이상 사용할 수 없습니다.

  1. obsoleted: version number

버전번호는 1~3개의 양의 정수로 구성되며, 마침표로 구분됩니다.


● message는 사용되지 않거나 더 이상 사용되지 않는 선언을 사용하는 것에 대한 경고 또는 오류를 표시 할 때,
컴파일러가 표시하는 텍스트 메세지를 제공하는데 사용됩니다.
  1. 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일에 결산글 한번 쓰겠네요

모두 행복한 연말 되세요 ~_~



반응형