Metatype

J.Noma·2021년 12월 8일
0

Swift : 문법

목록 보기
1/11

Reference


👻 Metatype 타입

✔️ 정의

metatype 타입은 class/struct/enum/protocol 타입의 타입을 말합니다

✔️ 용법

🔘 .Type/.Protocol : 타입의 타입
class/struct/enum는 타입명 뒤에 .Type을 붙이고, protocol은 프로토콜명 뒤에 .Protocol을 붙입니다
(ex. SomeClass.Type / SomeProtocol.Protocol)

🔘 .self : 타입의 타입의 값
위에서 설명한 .Type/.Protocol이 타입의 타입인 반면, .self는 타입의 타입의 값입니다
(ex. SomeClass.self)

따라서, 파라미터로 넘긴다던지 등 값으로써 사용이 필요하다면 .self를 사용해야 합니다

✔️ 인스턴스로부터 Metatype 타입 읽기

type(of:) 메서드를 사용하면 인스턴스로부터 타입을 추출할 수 있습니다
주의할 점으로, 이 메서드는 underlying이 아닌 해당 인스턴스의 dynamic/runtime 타입을 반환합니다

class SomeBaseClass {
    class func printClassName() {
        print("SomeBaseClass")
    }
}
class SomeSubClass: SomeBaseClass {
    override class func printClassName() {
        print("SomeSubClass")
    }
}
let someInstance: SomeBaseClass = SomeSubClass()
// The compile-time type of someInstance is SomeBaseClass,
// and the runtime type of someInstance is SomeSubClass
type(of: someInstance).printClassName()
// Prints "SomeSubClass"

✔️ initializer 표현에 사용될 수 있습니다

class AnotherSubClass: SomeBaseClass {
    let string: String
    required init(string: String) {
        self.string = string
    }
    override class func printClassName() {
        print("AnotherSubClass")
    }
}
let metatype: AnotherSubClass.Type = AnotherSubClass.self
let anotherInstance = metatype.init(string: "some string")

단, class 인스턴스에 대해서는 initializer에 required를 붙이거나 final class만 가능하다

profile
노션으로 이사갑니다 https://tungsten-run-778.notion.site/Study-Archive-98e51c3793684d428070695d5722d1fe

0개의 댓글