MetaType

이건준·2022년 8월 24일
0

1. 문제제기

  • 앱 개발을 하던 중에 다른 개발자분이 init메소드안에 type(of:)라는 함수를 사용하는 것을 보았고 이 부분이 어떤 이유에서 사용하는 것인지 알기위해 몇가지 찾아보았다

2. MetaType

  • type(of:)라는 것은 메타타입을 반환하는 함수이다, 이 메타타입은 타입의 타입이라고 한다
struct ExampleMetaType {
	static let identifier = "ExampleMetaType"
    let name: String
    let age: Int
}

let example = ExampleMetaType(name: "이건준", age: 25)
example.name // "이건준"
ExampleMetaType.identifier // "ExampleMetaType"
  • 위 코드처럼 클래스프로퍼티와 인스턴스프로퍼티는 이처럼 접근가능하다
  • 헌데 이 인스턴스를 이용해서 클래스프로퍼티와 인스턴스프로퍼티 둘 다 접근가능하게 하는 방법이 있는데 이것이 바로 앞서 이야기한 메타타입을 이용하는 것이다
type(of: example).init(name: "이건준", age: 25)
type(of: example).name // "이건준"
type(of: example).identifier // "ExampleMetaType"
  • 또한 이 메타타입을 이용해서 인자로 받기위해 함수를 만들어줄 수도 있다
func exampleMetaType(metaType: ExampleMetaType.Type) {

}

exampleMetaType(metaType: ExampleMetaType.self)
  • 위처럼 ExampleMetaType의 메타타입을 인자로 받기때문에 메타타입의 인스턴스를 인자로 넘겨줘야합니다, 메타타입의 인스턴스는 ExampleMetaType.self로 표현해줄 수 있습니다

Q. 메타타입의 인스턴스가 타입이라고 ??

  • 메타타입의 인스턴스가 타입이라면 타입을 통해서 접근하면 되지, 왜 굳이 .self를 붙여야할까 ??

우리가 여태 클래스프로퍼티나 생성자에 접근할때는 컴파일러가 이를 허용해준것이지, 타입은 말 그대로 타입이름일뿐 타입오브젝트 즉 메타타입의 인스턴스가 아니기때문에 .self가 필요한 것이다 !!

ExampleMetaType.identifier 
ExampleMetaType.self.identifier
  • 우리는 항상 위에서 보여지는것처럼 클래스프로퍼티에 접근할때 위처럼 코드해주었다
  • 허나 실제로 클래스프로퍼티와 생성자(required생성자)에 접근하기위해서는 아래처럼 코드해야하나 컴파일러에서 이를 허용해주고 있던것이다

0개의 댓글