Metatype(.self, .Type)
Β Metatype μ΄λ?
Β Metatype μ΄λ νμ
μ νμ
μ λνλΈλ€.
Β Type: νμ μ λ°κ³ μΆμ λ μ¬μ©
λ¨Όμ Typeμ λν΄μ μμ보μ.
λ§μ½
struct Human {
static let name = "HJ"
var age = 28
}
Swift
볡μ¬
μ΄λ° Human μ΄λ ꡬ쑰체λ₯Ό λ§λ€κ³ ,
μμ νμ
νλ‘νΌν°μΈ nameκ³Ό μΈμ€ν΄μ€ νλ‘νΌν°μΈ ageλ₯Ό μμ±νμλ€. νΈμΆ λ°©λ²μ
let HJ = Human.init()
Human.name // HJ
HJ.age = 28
Swift
볡μ¬
νμ
νλ‘νΌν°μ κ²½μ° νμ(Type)μ κ΄λ ¨λ νλ‘νΌν°λ‘ νμ
μ΄λ¦λ§ μλ©΄ νΈμΆμ΄ κ°λ₯νκ³ , μΈμ€ν΄μ€ νλ‘νΌν°μ κ²½μ° μΈμ€ν΄μ€λ₯Ό μμ±ν΄μΌλ§ νΈμΆμ΄ κ°λ₯νλ€.
μ¬κΈ°μ, Humanμ΄λ νμ
μ΄λ¦μ λ΄κ° λͺ¨λ₯Έλ€κ³ κ°μ νλ©΄, nameμ νΈμΆν μ μμκΉ?
β No!, type(of:) λ©μλλ₯Ό μ¬μ©ν μ μλ€.
ν΄λΉ νμ
μ μΈμ€ν΄μ€λ₯Ό μ μ₯νλ κ² μλλΌ, ν΄λΉ νμ
μ체λ₯Ό μ μ₯ν μ μλ€λ λ§
let HJType = type(of: HJ) // Human. Type
HJType.name // HJ
Swift
볡μ¬
μ΄λ κ², HJλ μΈμ€ν΄μ€λ₯Ό type(of:)μ λ£μΌλ©΄, λ°λ‘ Human νμ
μ체λ₯Ό λ°ν λ°μμ μ μ₯ν μ μλ€.
λν, λ°ν λ°μ μ μ₯ν HJType μ΄λ λ³μλ Human νμ
μ체μ΄κΈ° λλ¬Έμ νμ
νλ‘νΌν°μΈ nameμλ μ κ·Όν μκ° μλ€.
μ΄λ, μ΄ βνμ
μ체β λΌλ κ²μ΄ βλ©ν νμ
β μ΄λ€.
Human μ΄λ νμ
μ νμ
μ΄λ€.
μ²μμ HJλ λ³μμ Human μΈμ€ν΄μ€λ₯Ό λ£μλ€.
κ·ΈλΌ λ³΄ν΅ HJλ λ³μμ νμ
μ μκΈ°ν λ Human νμ
μ΄λΌκ³ μκΈ°νλ€.
κ·ΈλΌ μΈμ€ν΄μ€κ° μλ νμ
μ체λ₯Ό type(of:) λ©μλλ₯Ό μ΄μ©ν΄μ μ μ₯ν κ±°λΌλ©΄,
μ΄λ, νμ
μ체λ₯Ό λ°νλ°μ HJTypeμ΄λ λ³μμ νμ
μ λκ°μ΄ Human νμ
μ΄λΌκ³ λ§ν μκ° μλ€. (HJType β Human type)
μλνλ©΄ Human νμ
μ Humanμ΄λ νμ
μΌλ‘ μμ±ν μΈμ€ν΄μ€μ νμ
μ κ°λ¦¬ν€λ κ²μ΄κΈ° λλ¬Έμ΄λ€. μΈμ€ν΄μ€κ° μλλΌ μ λ§ νμ
μ체 μ΄κΈ° λλ¬Έμ΄λ€.
μ΄λ, μ΄ νμ
μ체λ₯Ό μκΈ°νλ κ²μ΄ λ°λ‘ λ©ν νμ
μ΄λ€.
HJTypeμ Humanμ΄λ νμ
μ νμ
μ΄λ€. μ¦, Humanμ λ©ννμ
μ΄λ€. νμ
μ νμ
(HJTypeμ Humanμ λ©ννμ
, HJType = Human.Type)
Β μμ½
β’
Human νμ
β HumanμΌλ‘ μμ±ν μΈμ€ν΄μ€μ νμ
(μΈμ€ν΄μ€ λ©€λ² μ¬μ© κ°λ₯)
β’
Human νμ
μ νμ
(λ©ν νμ
) β Human νμ
μ체λ₯Ό κ°λ¦¬ν€λ νμ
(νμ
λ©€λ² μ¬μ© κ°λ₯)
β λλ¬Έμ, λΉμ°ν νμ
μ체λ₯Ό κ°λ¦¬ν€κΈ° λλ¬Έμ, μΈμ€ν΄μ€ νλ‘νΌν°μΈ ageμ μ κ·Όν μκ° μλ€.
HJType.age // Instance member 'age' cannot be used on type 'Human'
Swift
볡μ¬
μ΄μ μ΄ λ©ννμ
μ νμνλ λ¨μ΄κ° λ°λ‘ .Type μ΄λ€.
Humanμ λ©ννμ
μ λ°λ‘ Human.Type μΌλ‘ λνλΌ μ μλ€.
λ©ννμ
μ νλμ νμ
, μ¦. μλ£νμ΄λΌκ³ 보면 λλ€.
let HJType: Human.Type = type(of: HJ)
Swift
볡μ¬
μ΄λ κ² ν μ μλ€.
Human.Typeμ Humanμ λ©ννμ
μΌλ‘,
type(of:)λ₯Ό ν΅ν΄ μ»μ λ¦¬ν΄ κ°μ νμ
μ Human.Typeμ΄λ€ λΌκ³ λ³Ό μ μλ€.
Human.Typeμ μ΄λ€ νλμ βκ°β μ΄λΌκ³ 보면 μλλ€. κ°μ΄ μλ Type μ΄λ€.
λ°λΌμ μμ²λΌ Type Annotationλ κ°λ₯, μ€μ νλΌλ―Έν°μ νμ
μ λ©ννμ
μΌλ‘ μ μΈν μλ μλ€.
Β 1. λ©ννμ μ μΈμ μ¬μ©ν κΉ?
protocol Human {
var job: String { get set }
init(_ job: String)
}
struct Teacher: Human {
var job: String
init(_ job: String) {
self.job = job
}
}
struct Student: Human {
var job: String
init(_ job: String) {
self.job = job
}
}
Swift
볡μ¬
λ§μ½ μμ κ°μ Human μ΄λ νλ‘ν μ½μ μ€μνλ Teacher, Student κ΅¬μ‘°μ²΄κ° μμ λ,
λ€μκ³Ό κ°μ΄
func create<T: Human>(type: T.Type) -> T {
switch type {
case is Teacher.Type:
return T.init("teacher")
case is Student.Type:
return T.init("student")
default:
fatalError("π₯")
}
}
Swift
볡μ¬
μ΄λ° μμΌλ‘ typeμ΄λ νλΌλ―Έν°μ νμ
μ μ λ€λ¦ T νμ
μ νμ
, μ¦ Tμ λ©ννμ
μ λ°μμ ν΄λΉ νμ
μ 체ν¬νμ¬ κ° νμ
μ λ§λ μμ
μ ν μΈμ€ν΄μ€λ₯Ό μμ±νμ¬ λ°νμν¬ μλ μλ€.
κ·Έλ¦¬κ³ caseλ₯Ό ν΅ν΄ Teacher, Studentλ νμ
μ νμ
, Teacher, Studentμ λ©ννμ
κ³Ό λΉκ΅λ₯Ό νλ€!
Β self: λ©ννμ μ κ°μ μ»μ΄λΈλ€
createλ λ©μλλ₯Ό νΈμΆμν€κΈ° μν΄μ λ€μκ³Ό κ°μ΄
let hj = create(type: Teacher.Type) // Type 'Teacher.Type' cannot conform to 'Human'
Swift
볡μ¬
create λ λ©μλλ₯Ό νΈμΆμν€κΈ° μν΄μ μ΄λ κ² μμ±μ νλ©΄, λ°λ‘ μ€λ₯κ° λλ€.
μλνλ©΄ μ μ½λλ νλμ μλ£νμ νλΌλ―Έν° κ°μΌλ‘ μ§μ΄ λ£μ κ²μ΄κΈ° λλ¬Έμ΄λ€.
κ·Έλ¬λ©΄ λ©ννμ
μ κ°μΌλ‘ μ»μ΄λ΄κΈ° μν΄μλ? β Β .self
let hj = create(type: Teacher.self)
Swift
볡μ¬
ν΄λΉ νμ
μ΄λ¦μ λκ³ .selfλ₯Ό νΈμΆν΄μ£Όλ©΄ λλ€.
μ΄λ κ² νλ©΄ createλ λ©μλκ° μ€νλκ³ λ νμ hj λ λ³μμ Teacherμ μΈμ€ν΄μ€κ° λ€μ΄κ°κ² λλ€.
Β 1. Static Metatype VS Dynamic Metatype
self λ₯Ό μ΄μ©ν΄ λ§λλ κ²μ Static Metatype μ΄κ³ ,
type(of:) λ₯Ό μ΄μ©ν΄μ λ§λλ κ²μ Dynamic Metatype μ΄λ€.
λμ μ°¨μ΄μ μ,
.self λ Static Metatype μ΄λΌ μ»΄νμΌ μμ μ νμ
μ΄ μ ν΄μ§κ³ ,
type(of:) λ Dynamic Metatype μ΄λΌ λ°νμ μμ μ νμ
μ΄ μ ν΄μ§λ€.
.self λ₯Ό μ΄μ©ν΄μ λ©ννμ
κ°μ μ»μ΄λΌ κ²½μ°,
Teacher.self.init("")
Swift
볡μ¬
νμ νμ
μ λκ³ μ¬μ©ν΄μΌ νκΈ° λλ¬Έμ staticμΌλ‘ λμνλ€.
(λͺ¨λ νμ
μλ .selfκ° λ€μ΄μλ€)
let anyType: Any = 10
type(of: anyType) // Int.Type
Swift
볡μ¬
μμ κ°μ΄ AnyμΌ κ²½μ°, μ»΄νμΌ μμ μλ νμ
μ΄ μ ν΄μ§μ§ μκ³ λ°νμ μμ μ μ ν΄μ§λλ°, μ΄ κ²μ 보면 type(of:) λ λ°νμ μμ μ λμμ΄ λλ€λ κ²μ νμΈν μ μλ€.