티스토리 뷰

Swift

Swift ) Any와 AnyObject의 차이

Zedd0202 2017. 9. 10. 18:31
반응형

 

안녕하세요 :) Zedd입니다. 

오늘은 Any와 AnyObject의 차이를 알아볼거에요!!

시작할게요!!

 

 

Any와 AnyObject의 차이


 

 

The Swift Programming Language에서, Any와 AnyObject를 이렇게 말합니다. 

 

Swift는 특정하지 않은 타입에 대해 동작하도록 특별한 타입 두가지를 제공합니다. 

 

Any

Any는 함수타입을 포함하여 모든 타입의 인스턴스를 나타낼 수 있습니다.

 

AnyObject

AnyObject는 모든 클래스 타입의 인스턴스를 나타낼 수 있습니다.

 

우리 <Array사용해보기(1/2)>에서 Any를 잠깐 봤었죠?

 

 

 

 

특정한 타입 하나가 아닌 여러 타입을 넣고 싶을 때, Any를 썼었죠.

보시다시피 Any로 타입을 지정하게 되면 여러 자료형을 한번에 넣을 수 있어요. 

정확하게는, 구조체로 구현된 값타입은 모두 들어올 수 있습니다.

var anyArr : [Any] = [1,"hi",true,1.0]

 

이렇게말이죠. Int, String, Bool, Float, Double등 모두 구조체로 구현되어있답니다. 

(물론 구조체로 구현된 값타입만 들어올 수 있는거 아닙니다!! class로 구현된것도 들어갈 수 있어요. AnyObject를 설명하기 위해 구조체 이야기를 했습니다.)

 

 

그럼..저 [Any]를 [AnyObject]로 바꾸면 어떻게 될까요?

var anyArr : [AnyObject] = [1,"hi",true,1.0]//error!!

 

에러가 나게 됩니다...

그리고 

 

var anyArr : [AnyObject] = [1 as AnyObject,"hi" as AnyObject,true as AnyObject ,1.0 as AnyObject]

 

 

이렇게 고쳐야만 에러가 사라지게 됩니다. 

위에서 났던 에러를 다시 볼까요? 

 

 

error: value of type 'Int' does not conform to expected element type 'AnyObject'

 

 

 

배열안에 있는 값들이 AnyObject를 준수(conform)하지 않는다고 나옵니다. 

 
 

엥...conform..?이거 우리 프로토콜에서만 보던 말인데..

AnyObject가 프로토콜인가..?

 

네 맞습니다!!! AnyObject는 "프로토콜"이에요.

 

AnyObject를 "모든 클래스가 암시적으로 준수하는 프로토콜"이라고 정의해놓았네요. 

그리고 OverView의 마지막줄을 보시면,

 

"AnyObject can be used as the concrete type for an instance of any class, class type, or class-only protocol. "

AnyObject는 클래스, 클래스 타입 또는 클래스 전용 프로토콜의 인스턴스에 대한 구체적인 타입으로 사용될 수 있습니다.

 

라고 하네요. 

그러니까!!위에서 에러가 난 이유는 배열 안에 있는 값들이 클래스타입이 아니기때문이죠.

 

클래스타입을 넣어줘볼까요? 

 

class aType { }

class bType { }

var anyObjectArr : [AnyObject] = [aType(),bType()]

 

 

짠! 정말 클래스타입을 넣어주니까 에러가 나지않죠?

 

 

오늘은 간단하게 Any와 AnyObject의 차이점에 대해서 알아보았어요 ㅎㅎ

도움이 되었으면 좋겠네요 :) 안녕!!

 

 

 

반응형