The Swift Programming Language 책에서 정의한 메타타입
내용을 적당히 요약하면 메타타입은 어떤 타입의 타입을 나타내고 메타타입 값은 T.self 또는 type(of:) 로 얻을 수 있다.
런타임때 인스턴스의 메타타입 값을 얻으려면 type(of:)를 사용하면 된다. 메타타입 값을 얻기 위해 사용하는 .self 는 클래스를 생성하면 자동으로 생성되는 self 프로퍼티와 아무런 상관이 없다. 혼동하지 말자.
let i: Int = 10
- i는 Int의 인스턴스
- Int는 i라는 인스턴스의 타입
- Int.Type은 Int의 메타타입
let j = Int //build error, 타입은 값이 될 수 없음 let k = Int.Type //build error, 메타타입은 값이 될 수 없음 let l = Int.Type.self //Int의 메타타입의 메타타입 값(Value)
print("\(i.self)") //10, 인스턴스의 메타타입 값 print("\(Int)") //build error, 타입은 값이 될 수 없음 print("\(Int.self)") //Int, Int의 메타타입 값 print("\(Int.Type)") //build error, 메타타입은 값이 될 수 없음 print("\(Int.Type.self)") //Int.Type, Int의 메타타입의 메타타입 값
let a: Any = 10 fn(a) func fn(_ a: Any) { print("\(type(of: a))") //Int, a(Int의 인스턴스)의 Dynamic(런타임) 메타타입 값 }
class Test { static public var typeProperty = 0 //인스턴스 없이 사용, 전역 변수와 같음 } var t = Test() // Test의 메타타입은 Test.self, static(컴파일타임) // t의 메타타입은 type(of: t), dynamic(런타임) print(Test.self.typeProperty) //0 // Test 메타타입 값의 타입 프로퍼티 접근, Test.typeProperty와 같음