Bibi's DevLog π€π
[Swift] type(of:) λ³Έλ¬Έ
type(of:)
κ°μ λ€μ΄λλ―Ή νμ μ λ°νν©λλ€.
μ μΈ
func type<T, Metatype>(of value: T) -> Metatype
λ°νκ°
λμ νμ (= λ©ννμ metatype μΈμ€ν΄μ€)
νλΌλ―Έν°
value
: λμ νμ μ μ°ΎμΌλ € νλ κ°
μ€λͺ
μ΄ type(of:)
ν¨μλ κ°μ λμ νμ
μ μ°ΎκΈ° μν΄ μ¬μ©ν μ μμ΅λλ€. νΉν λμ νμ
μ΄ μ μ νμ
κ³Ό λ€λ₯Ό λ μ¬μ©ν μ μμ΅λλ€. κ°μ μ μ νμ
(static type) μ κ°μ λͺ
μλ, μ»΄νμΌ μμ μ νμ
μ λ§ν©λλ€. κ°μ λμ νμ
(dynamic) μ μ€ν μμ μ κ°μ μ€μ νμ
μ λ§νλ©°, κ°μ ꡬ체 νμ
μ νμ νμ
μ΄ λ μ μμ΅λλ€.
μλ μ½λμμ, count
λ³μλ IntλΌλ λμΌν μ μ νμ
κ³Ό λμ νμ
μ κ°μ§κ³ μμ΅λλ€. κ·Έλ¬λ, count
κ° printInfo(_:)
ν¨μλ‘ μ λ¬λλ©΄, value
νλΌλ―Έν°λ Any(νλΌλ―Έν°μ μ μλ νμ
)λΌλ μ μ νμ
κ³Ό IntλΌλ λμ νμ
μ κ°μ§κ² λ©λλ€.
func printInfo(_ value: Any) {
let t = type(of: value)
print("'\(value)' of type '\(t)'")
}
let count: Int = 5
printInfo(count)
// '5' of type 'Int'
type(of:)
λ©μλλ‘λΆν° λ°νλ λμ νμ
μ, ν΄λμ€, ꡬ쑰체, enum, λΉνλ‘ν μ½ νμ
T
μ λν΄μλ ꡬ체 λ©ννμ
(T.Type
)μ΄λ©°, νλ‘ν μ½ λλ νλ‘ν μ½ κ΅¬ν P
μ λν΄μλ μ€μ‘΄ λ©ννμ
(P.Type
)μ
λλ€. λ§μ½ type(of:)
λ‘ μ λ¬λ κ°μ μ μ νμ
μ΄ ν΄λμ€λ νλ‘ν μ½λ‘ μ νλμ΄ μλ€λ©΄, κ·Έ ν΄λμ€ λλ νλ‘ν μ½μ μ΄λμ
λΌμ΄μ λ λ€λ₯Έ static(μ μ ) memberλ€μ μ κ·ΌνκΈ° μν΄ κ·Έ λ©ννμ
μ μ¬μ©ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄, μλ μμμμ printSmileyInfo(_:)
ν¨μμ κ°μΌλ‘μ μ λ¬λ νλΌλ―Έν°λ Smiley
ν΄λμ€μ μΈμ€ν΄μ€ λλ Smiley
μ μλΈν΄λμ€ μ€ νλμ
λλ€. μ΄ ν¨μλ type(of:)
λ₯Ό value
μ λμ νμ
μ μ°ΎκΈ° μν΄ μ¬μ©νλ©°, μ¬κΈ°μ valueλ Smiley.Type
λ©ννμ
μ μΈμ€ν΄μ€μ
λλ€.
class Smiley {
class var text: String {
return ":)"
}
}
class EmojiSmiley: Smiley {
override class var text: String {
return "π"
}
}
func printSmileyInfo(_ value: Smiley) {
let smileyType = type(of: value)
print("Smile!", smileyType.text)
}
let emojiSmiley = EmojiSmiley()
printSmileyInfo(emojiSmiley)
// Smile! π
μ΄ μμμμ, smileyType
λ©ννμ
μ text
νλ‘νΌν°μ μ κ·Όνλ©΄, Smiley
ν΄λμ€μ μλ μ μ λμ EmojiSmiley
μλΈν΄λμ€λ‘λΆν° overrideλ κ°μ κ²μνκ² λ©λλ€.
μ λ€λ¦ λ§₯λ½μμ λμ νμ μ°ΎκΈ°
μΌλ°μ μΌλ‘, ꡬ체 λ©ννμ
κ³Ό μ€μ‘΄ λ©ννμ
μ¬μ΄μ μ°¨μ΄μ μ λν΄ μ νμλ μμ΅λλ€. νμ§λ§ type(of:)
λ₯Ό νΈμΆνλ κ²μ νλ‘ν μ½μ λ°μΈλ©λ νμ
νλΌλ―Έν°κ° μλ μ λ€λ¦ λ§₯λ½μμ μμμΉ λͺ»ν κ²°κ³Όκ° λ°μν μ μμ΅λλ€. μ λ€λ¦ νλΌλ―Έν° T
κ° νλ‘ν μ½ P
μ λ°μΈλ©λμ΄ μλ κ²½μ°, νμ
νλΌλ―Έν°λ μ λ€λ¦ ν¨μμ body λ΄μμ νλ‘ν μ½ νμ
μμ΄ μ μ μΌλ‘ μλ €μ Έ μμ§ μμ΅λλ€. κ·Έ κ²°κ³Ό, type(of:)
λ ꡬ체 λ©ννμ
μΈ P.Protocol
λ§μ λ°ννκ² λ©λλ€.
μλ μμλ printGenericInfo(_:)
ν¨μλ₯Ό μ μν©λλ€. μ΄ ν¨μλ μ λ€λ¦ νλΌλ―Έν°λ₯Ό λ°κ³ μ νλ‘ν μ½ P
μ λν΄ String
νμ
μ ν©μ±μ μ μΈν©λλ€. P
λΌλ μ μ νμ
μ λ¬Έμμ΄λ‘ printGenericInfo(_:)
ν¨μλ₯Ό νΈμΆνλ©΄, type(of:)
μ νΈμΆ κ²°κ³Όλ String.self
λμ P.self
κ° λ©λλ€ (μ¦ νλΌλ―Έν° λ΄λΆμ λμ νμ
).
func printGenericInfo<T>(_ value: T) {
let t = type(of: value)
print("'\(value)' of type '\(t)'")
}
protocol P {}
extension String: P {}
let stringAsP: P = "Hello!"
printGenericInfo(stringAsP)
// 'Hello!' of type 'P'
μ΄ μμμΉ λͺ»ν κ²°κ³Όλ λ€μκ³Ό κ°μ μ΄μ λλ¬Έμ λ°μν©λλ€. printGenericInfo(_:)
λ΄λΆμ type(of: value)
νΈμΆμ T.Type
μ μΈμ€ν΄μ€μΈ λ©ννμ
μ λ°νν΄μΌ νλλ°, String.self
(κΈ°λλλ λμ νμ
)λ P.Type
(value
μ ꡬ체 λ©ννμ
)μ μΈμ€ν΄μ€κ° μλλλ€. μ΄ μ λ€λ¦ λ§₯λ½μμ value
λ΄λΆμ λμ νμ
μ μ»κΈ° μν΄μλ, type(of:)
μ νΈμΆν λ νλΌλ―Έν°λ₯Ό Any
νμ
μΌλ‘ λ³νν΄μΌ ν©λλ€.
func betterPrintGenericInfo<T>(_ value: T) {
let t = type(of: value as Any)
print("'\(value)' of type '\(t)'")
}
betterPrintGenericInfo(stringAsP)
// 'Hello!' of type 'String'
'π±π iOS > π Apple Developer Documentation' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[iOS] UINavigationController - viewControllersμ pushViewController(_:animated:) (0) | 2022.12.12 |
---|---|
[Swift] ArraySlice(SubSequence) - λ°°μ΄μ λΆλΆ μ°Έμ‘°νκΈ° (0) | 2022.12.06 |
[Swift / Array] swapAt(_:_:) (0) | 2022.09.28 |
[Swift / Array] enumerated() - λ°°μ΄μ μ΄κ±°νλ μνμ€ λ§λ€κΈ° (1) | 2022.09.23 |
[π / UIKit] UINavigationController (1) | 2022.09.23 |