[Swift] Metatype, ObjectIdentifier

Lena·2021년 3월 5일
0
  • Dynamic types

Metatype Type

-meta는 추상화를 의미하는 접두어.
어떤 class, struct, enum에 .Type을 붙여 타입을 타입으로 추상화한 것이 metatype 이다.

결국 Metatype도 Type이다.

  • class의 metatype : SomeClass.Type
  • protocol의 metatype : SomeProtocol.Protocol

metatype을 구하고 싶다면 타입 뒤에 .self를 붙이면 된다. SomeClass.self

type(of:)

Generic Function
type(of:)
Returns the dynamic type of a value.

스위프트 표준 라이브러리에서 제공하는 type(of:) 함수를 이용해서 Metatype을 구할 수도 있다.

func type<T, Metatype>(of value: T) -> Metatype

간단한 예제.

var number = 5
type(of: number) // Int.Type
// 값에 대한 메타 타입을 알려준다.

instance from metatype

Use an initializer expression to construct an instance of a type from that type’s metatype value. For class instances, the initializer that’s called must be marked with the required keyword or the entire class marked with the final keyword.

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")

ObjectIdentifier

Structure
ObjectIdentifier
A unique identifier for a class instance or metatype.

class 인스턴스와 metatype만 있는 unique identifier다.
struct, enum, function에는 identifier라는 개념이 없다.

식별값을 나타내는 구조체로, .init(AnyObject)로 생성할 수 있다.
hashValue를 instance property로 갖고 있다.

This unique identifier is only valid for comparisons during the lifetime of the instance.

In Swift, only class instances and metatypes have unique identities. There is no notion of identity for structs, enums, functions, or tuples.

✔️ 인스턴스의 값을 비교 할 것인지, 타입을 비교할 것인지에 따라 적절히 활용할 것


docs-metatype-type
medium-metatype

0개의 댓글