관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Metatype (메타 타입), generics (제네릭) 본문

iOS 기본 (swift)

[iOS - swift] Metatype (메타 타입), generics (제네릭)

jake-kim 2021. 1. 29. 01:13

파라미터에 타입을 받고 싶은 경우?

  • 함수 파라미터로 instance로 받는 예제
printType(of: "123") // 123
func printType<T>(of instance: T) {
    print(instance)
}
  • 함수 파라미터로 type을 받고 싶은 경우 - metatype사용
    • type(of:): 파라미터는 인스턴스이고, 반환값은 타입
    • T.Type: 인스턴스가 아닌 타입
printType(of: type(of: "123")) // String
func printType<T>(of instance: T.Type) {
    print(instance)
}
  • Metatype이 있어야 하는 이유: 함수 내에서 타입을 파라미터로 받아서 캐스팅이 필요한 경우, switch로 타입값을 구분해야하는 경우

Metatype

  • 타입의 타입
    • SomeClass의 메타타입은 SomeClass.Type
    • 메타타입 접근: 타입.self
    • cf) type(of:) 메소드는 인스턴스의 타입을 리턴

메타타입 접근: 타입.self

  • 메타타입 이용: 타입의 타입을 얻고싶은 경우
printType(of: String) // compile error
printType(of: String.self)
func printType<T>(of type: T.Type) {
    print(type)
}

Static Metatype - .self의 의미

  • 컴파일 타임에서 object type
    • SomeClass.SomeStaticFunc() 호출에서 사실상 .self가 생략된 형태: SomeClass.self.SomeStatisFunc()와 동일
  • TableView.register코드에서 .self 사용
tableView.register(MyTableViewCell.self, forReuseIdentifier: "myCell")

Dynamic Metatype - type(of:)

  • instance를 파라미터로 받고 해당 instance의 type을 반환
let myNum: Any = 1 // 컴파일 타임에는 타입이 Any지만 런타임에는 타입이 Int
type(of: myNum) // Int.type

self와 Self의 차이

 

Comments