Taehyeon-Kim/Blog

[iOS] Any, AnyObject

Closed this issue · 0 comments

들어가며

Swift는 타입에 민감한 언어다. 잊지 말자!

Overwrap

Swift에는 모든 타입을 담을 수 있는 범용 타입이 존재한다.
우리는 그것을 Any, AnyObject 라고 부른다.

Any & Any Object

타입 캐스팅을 수행할 때 상속 관계에 있는 클래스끼리만 캐스팅이 가능하다.
일반적으로 상속 관계에 있을 때, 업 캐스팅과 다운 캐스팅이 가능하다.

  • 업 캐스팅 as
  • 다운 캐스팅 as?, as!

그런데 Any, AnyObject 타입을 이용하면 상속 관계가 아니어도 타입 캐스팅을 할 수 있다.

Any

var infomations: [Any] = []

다음과 같이 Any 타입으로 명시해주면, 모든 타입에 상관 없이 데이터를 저장할 수 있게 된다.

informations.append(7)
informations.append(7.2)
informations.append("string")
informations.append(false)
informations.append(Person.init())
...

AnyObject

이 친구는 조금 제한적이다.
클래스 타입만 저장할 수 있다.
여러 종류의 객체를 저장할 수 있는 건데, 그 타입이 클래스여야한다는 것이다.

var infomations: [AnyObject] = []

informations.append(Swift.init())
informations.append(Python.init())

🚨 주의

Any나 AnyObject 타입으로 선언된 변수의 실제 타입은 런타임 시점에 결정된다.

var city: Any = "Seoul"

이렇게 Any 타입으로 정해버리면, 컴파일 시점에서 String 메서드를 사용할 수 없다.
너무나 자명하게 String 타입이라는 것을 알고 있음에도 말이다..

그래서 String으로 타입 캐스팅을 해준 후에 사용해야 한다.

if var city = city as? String {
  // code - String 타입 관련 메서드 사용
}

항상 타입을 체크해줘야한다는 불편함이 존재한다. 🥲
그러니까 적절한 상황에서만 사용하자.