-
Checking Type & Downcasting - Type CastingiOS/π Swift 2021. 1. 21. 00:57
Checking Type
/* item μ΄ Transportation νμ μΌλ‘ Upcasting λμ΄ μλ μν© */ ... if item is Metro { } else if item is Bus { } ...
Type check operator ` is ` λ₯Ό μ¬μ©νμ¬ μΈμ€ν΄μ€κ° νΉμ subclass νμ μΈμ§ μλμ§ νμΈν©λλ€.
μΈμ€ν΄μ€κ° νΉμ subclass νμ μ΄ λ§λ€λ©΄ true λ₯Ό , μλλΌλ©΄ false λ₯Ό λ°νν©λλ€.
Type Casting μ νμ μ λ€λ₯Έ νμ μΌλ‘ μμ λ°κΎΈλ κ²μ΄ μλλΌ λ€λ₯Έ νμ μΌλ‘ μ·¨κΈλ§ νλ κ²μ΄λ―λ‘, is μ°μ°μλ‘ sublcassμΈμ§ μλμ§λ₯Ό νμΈ ν μ μκ² μ΅λλ€.
Downcasting
# as? # as!
μ΄λ€ μνΌ ν΄λμ€ νμ μ κ°μ§ μΈμ€ν΄μ€λ μ¬μ€ μλΈν΄λμ€ μΈμ€ν΄μ€μΌ μλ μμ΅λλ€.
μ¦, μ¬μ€μ μλΈ ν΄λμ€ νμ μΈλ° μ μΊμ€ν λμ΄μ μνΌν΄λμ€μ νμ μΈ `μ²` νλ μν©μ λλ€.
μ΄λ° μν©μμ `Downcasting` μ ν΅ν΄ μλΈν΄λμ€ νμ μΌλ‘ νμ μΊμ€ν ν΄μ€ μ μμ΅λλ€.
νμ μΊμ€ν μ°μ°μ ` as? ` μ ` as! ` λ₯Ό ν΅ν΄μ κ°λ₯ν©λλ€.
κ΄λ ¨ κΈ : Optionals - Optionals
` as? `λ μλΈν΄λμ€λ₯Ό μ΅μ λ νμ μΌλ‘ λννμ¬ λ°νν©λλ€. μ¦, μ±κ³΅ μμλ Optional(subclass) λ₯Ό λ°ννκ³ , μ€ν¨ μ nilμ λ°νν©λλ€.
λ°λΌμ λ³΄ν΅ μ΅μ λ λ°μΈλ© ν¨ν΄μΌλ‘ μ²λ¦¬ν©λλ€.
λ€μ΄ μΊμ€ν μ±κ³΅ μ¬λΆκ° νμ€νμ§ μμ λμλ ` as? ` μ°μ°μλ₯Ό μ¬μ©ν©λλ€.
` as! `λ λ€μ΄ μΊμ€ν ν μ΅μ λ νμ μ κ°μ μΈλννμ¬ λ°νν©λλ€. λ°λΌμ μΊμ€ν μ€ν¨ μ μ± ν¬λμκ° λ°μν©λλ€.
λ€μ΄ μΊμ€ν μ΄ νμ μ±κ³΅νλ€λ©΄ ` as! ` μ°μ°μλ₯Ό μ¬μ©ν©λλ€.
κ·Έλ λ€λ©΄ λ€μ΄μΊμ€ν μ΄ μ€ν¨νλ κ²½μ°λ μΈμ μΌκΉμ?
1. μΊμ€ν νκ³ μΆμ νμ μ΄ μμκ³μΈ΅μ μ‘΄μ¬νμ§ μκ±°λ,
2. μνΌν΄λμ€μμ λΆκΈ°νλ μλΈν΄λμ€ μ’ λ₯κ° 2κ° μ΄μμΌ κ²½μ°μ λλ€.
μλ κ·Έλ¦Όμ 2λ² μν©μ λλ€.
Bus νμ μ μ μΊμ€ν λμ΄ Transportation νμ μ΄ λμλλ°,
Metro νμ μΌλ‘ λ€μ΄ μΊμ€ν μ μλνλ€λ©΄ μ€ν¨νμ¬ nilμ 리ν΄ν κ²μ λλ€.
var bus: Bus = Bus(fare: 750, busNumber: 6617) // μ μΊμ€ν var trans: Transportation = bus /* λ€μ΄μΊμ€ν nil λ°νλμ΄, λ°μΈλ© μ€ν¨λ‘ else λΈλ‘μ΄ μ€ν λ©λλ€ */ if let bus = trans as? Metro { print("\(lineNumber)") } else { print("fail") } // "fail"
N O T E
Type Casting μ μΈμ€ν΄μ€ μ체λ μΈμ€ν΄μ€ μμ κ°μ μ ν λ³κ²½νμ§ μμ΅λλ€.
μΈμ€ν΄μ€λ κ·Έλλ‘ λλκ³ , μ·¨κΈμ μΊμ€ν λ νμ μΌλ‘ νλ κ²μ λλ€.
μΈμ€ν΄μ€λ₯Ό λ³κ²½νλ Type Conversionκ³Ό ꡬλΆν΄μΌ ν©λλ€.
Type Casting for Any and AnyObject
Any νμ μ ν¨μ νμ μ ν¬ν¨ν λͺ¨λ νμ μ μΈμ€ν΄μ€λ₯Ό ννν μ μλ νμ μ λλ€.
λ€μ λ§ν΄μ, λͺ¨λ νμ μ Any νμ μΌλ‘ μΊμ€ν μ΄ κ°λ₯ν©λλ€
AnyObject νμ μ λͺ¨λ ν΄λμ€ νμ μ ννν μ μλ νμ μ λλ€.
λ€μ λ§ν΄μ, λͺ¨λ ν΄λμ€ νμ μ AnyObject νμ μΌλ‘ μΊμ€ν μ΄ κ°λ₯ν©λλ€.
var things = [Any]() things.append(0) // Int things.append(0.0) // Double things.append(43) // Int things.append("πΆ") // String things.append((3.0, 5,0)) // Tuple
Any νμ μ things λ°°μ΄μ λ€μ΄κ° λ©€λ²λ€μ Any νμ μΌλ‘ μΊμ€ν λμ΄ λ€μ΄κ°λλ€.
μλ νμ μΌλ‘ μ¬μ©νλ €λ©΄ as? νΉμ as! μ°μ°μλ‘ μΊμ€ν νμ¬μΌ ν©λλ€.
μμ μμλ for-in μννλ©° switch λ¬Έμ λλ Έμ΅λλ€. (μλ΅)
λ!
'iOS > π Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Adopting a Protocol Using a Synthesized Implementation - Protocols (0) 2021.01.27 [Swift] Delegation (0) 2021.01.26 Type Casting Overview - Type Casting (0) 2021.01.21 [Swift] νμ μΌλ‘μμ νλ‘ν μ½ ( Protocol as Type ) (0) 2021.01.19 [Swift] νλ‘ν μ½ μμ±μ μꡬμ¬ν (Initializer Requirements) (0) 2021.01.19