8.5.3 Any, AnyObject
우리는 상속 관계에 있는 클래스들 사이에서 캐스팅을 진행하였습니다. 하지만 상속 관계에 있지 않아도 타입 캐스팅이 가능한 예외가 있는데 바로 Any, AnyObject 타입입니다. 이 둘은 일종의 범용 타입입니다. 그 중 AnyObject는 클래스의 일종으로 모든 종류의 클래스 타입을 저장할 수 있는 범용 타입 클래스입니다.
var allCar: AnyObject = Car()
allCar = SUV()
또한 모든 클래스의 인스턴스는 AnyObject 타입으로 선언된 함수나 메서드의 인자값으로 사용될 수도 있으며, AnyObject 타입을 반환하는 함수나 메서드는 모든 종류의 클래스를 반환할 수 있다는 의미로 해석되기도 합니다.
func move(_ param: AnyObject) -> AnyObject {
return param
}
move(Car())
move(Vehicle())
고정된 하나만의 타입을 저장하는 배열, 딕셔너리, 집합에서도 AnyObject 타입을 사용하면 모든 클래스를 저장할 수 있습니다.
var list = [AnyObject]()
list.append(Vehicle())
list.append(Car())
list.append(SUV())
위에서 말했듯 AnyObject는 클래스일 때만 AnyObject 타입으로 정의할 수 있습니다. 구조체이거나 열거형은 허용하지 않습니다. Any 객체 역시 비슷하지만, 클래스에 국한되지 않고 스위프트에서 제공하는 모든 타입을 허용하는 특성이 있습니다. 원시 자료형, 구조체, 열거형, 심지어 함수까지 적용됩니다.
var value: Any = "Sample String"
value = 3
value = false
value = [1,3,5,7,9]
value = {
print("함수가 실행됩니다")
}
따라서 함수의 인자값으로 종류에 상관없이 입력받거나 집단 자료형에서도 구분 없이 사용 가능합니다
func name(_ param: Any) {
print("\(param)")
}
name(3) // Int
name(false) // Bool
name([1,3,5,7,9]) // Array
var rows = [Any]()
rows.append(3)
rows.append(false)
rows.append([1,3,5,7,9])
Last updated