-meta는 추상화를 의미하는 접두어.
어떤 class, struct, enum에 .Type
을 붙여 타입을 타입으로 추상화한 것이 metatype 이다.
결국 Metatype도 Type이다.
SomeClass.Type
SomeProtocol.Protocol
metatype을 구하고 싶다면 타입 뒤에 .self
를 붙이면 된다. SomeClass.self
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
// 값에 대한 메타 타입을 알려준다.
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")
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.
✔️ 인스턴스의 값을 비교 할 것인지, 타입을 비교할 것인지에 따라 적절히 활용할 것