범용
타입이다.
타입캐스팅
을 수행할 때 일반적으로 상속 관계에 있는 클래스끼리만 캐스팅이 가능하다.
그러나, Any
, AnyObject
타입인 경우 상속 관계가 아니어도 타입 캐스팅을 할 수 있다.
상속
관계에 있을 때, 업캐스팅(as
), 다운캐스팅(as?
, as!
)을 할 수 있다.
근데, Any
와 AnyObject
타입인 경우 상속
관계가 아니어도 타입 캐스팅을 할 수 있다.
런타임
시점에 타입이 결정된다.
Swift
는 자료형
에 민감한 언어이다. Any
는 모든 타입을 저장할 수 있는 자료형var things : [Any] = []
things.append(1)
things.append(1.0)
things.append("Johnson")
things.append(false)
things.append((Human.init()))
things.append({ print("I am Johnson")})
Any 타입에는 값 타입 (구조체, 열거형)
, 참조타입 (클래스, 클로저)
모두 섞어서 저장이 가능하다.
클래스 타입
을 저장Any
보다 조금 더 까다로움클래스 타입
만 저장할 수 있다. var things : [AnyObject] = []
things.append(1) // Argument type 'Int' expected to be an instance of a class
things.append(1.0) // Argument type 'Double' expected to be an instance of a c
things.append(Teacher.init())
Any나 AnyObject는 런타임 시점에 타입이 결정되기 때문에, 컴파일 시점에 위와 같이 해당 타입에 대해서 알 수 없다. 때문에 해당 타입의 멤버에도 접근할 수 없다.
만약에 Any
타입인 name을 String
으로 사용하고 싶다면
if var name = name as? String{
name.append("_")
}
swift
는 기본적으로 자료형에 민감하기 때문에, 왠만하면 Any
와 AnyObject
는 사용을 지양하는 것이 좋긴하다.