Swift Metatype

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와 같음


답글 남기기

이메일 주소는 공개되지 않습니다.