μλ νμΈμ. μ€λμ Swiftμμ 'νμ μΊμ€ν (Type Casting)'μ λν΄ μμλ³΄κ² μ΅λλ€. νμ μΊμ€ν μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ μ μ°μ±κ³Ό λ€νμ±μ ꡬννλ κΈ°μ λ‘, Swiftμ νμ μμ μ±μ μ μ§νλ©΄μλ λ€μν νμ κ°μ μνΈμμ©μ κ°λ₯νκ² ν©λλ€.
π νμ μΊμ€ν μ΄λ?
νμ μΊμ€ν μ μΈμ€ν΄μ€μ νμ μ νμΈνκ±°λ, ν΄λΉ μΈμ€ν΄μ€λ₯Ό ν΄λμ€ κ³μΈ΅ ꡬ쑰 λ΄μ λ€λ₯Έ νμ μΌλ‘ μ·¨κΈνλ λ°©λ²μ λλ€. Swiftμμλ isμ as μ°μ°μλ₯Ό ν΅ν΄ νμ μΊμ€ν μ ꡬνν©λλ€.
- is μ°μ°μ: μΈμ€ν΄μ€κ° νΉμ νμ μΈμ§ νμΈ(νμ 체ν¬)
- as μ°μ°μ: μΈμ€ν΄μ€λ₯Ό λ€λ₯Έ νμ μΌλ‘ λ³ν(νμ λ³ν)
μ΄λ₯Ό ν΅ν΄ ν΄λμ€ κ³μΈ΅ ꡬ쑰λΏλ§ μλλΌ νλ‘ν μ½ μ€μ μ¬λΆλ νμΈν μ μμ΅λλ€.
π νμ μΊμ€ν μ μν ν΄λμ€ κ³μΈ΅ ꡬ쑰
νμ μΊμ€ν μ κ°λ μ μ΄ν΄νκΈ° μν΄ λ―Έλμ΄ μμ΄ν μ λ€λ£¨λ κ°λ¨ν ν΄λμ€ κ³μΈ΅ ꡬ쑰λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
// κΈ°λ³Έ ν΄λμ€: λͺ¨λ λ―Έλμ΄μ κ³΅ν΅ μμ±
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
// μνλ₯Ό λνλ΄λ νμ ν΄λμ€
class Movie: MediaItem {
var director: String
init(name: String, director: String) {
self.director = director
super.init(name: name)
}
}
// λ
Έλλ₯Ό λνλ΄λ νμ ν΄λμ€
class Song: MediaItem {
var artist: String
init(name: String, artist: String) {
self.artist = artist
super.init(name: name)
}
}
// μ¬λ¬ λ―Έλμ΄ μμ΄ν
μ ν¬ν¨νλ λ°°μ΄
let library = [
Movie(name: "μΊμ¬λΈλμΉ΄", director: "λ§μ΄ν΄ 컀ν°μ¦"),
Song(name: "λΈλ£¨ μ€μ¨μ΄λ μμ¦", artist: "μλΉμ€ νλ μ¬λ¦¬"),
Movie(name: "μν°μ¦ μΌμΈ", director: "μ€μ¨ μ°μ€"),
Song(name: "λ μ μ€ μ¨λ¦¬", artist: "체μ€λ νΈν¬μ€"),
Song(name: "λ€λ² κ³ λ κΈ°λΈ μ μ
", artist: "λ¦ μ μ¬λ¦¬")
]
// libraryμ νμ
μ [MediaItem]μΌλ‘ μΆλ‘ λ©λλ€
μ΄ μμ μμ library λ°°μ΄μ Movieμ Song μΈμ€ν΄μ€λ₯Ό λͺ¨λ ν¬ν¨νμ§λ§, λ°°μ΄ μ체λ [MediaItem] νμ μΌλ‘ μΆλ‘ λ©λλ€. μ΄λ Swiftμ νμ μΆλ‘ μμ€ν μ΄ λ°°μ΄ λ΄ λͺ¨λ μμμ κ³΅ν΅ μμ νμ μ μ°ΎκΈ° λλ¬Έμ λλ€.
π νμ νμΈνκΈ° (is μ°μ°μ)
is μ°μ°μλ₯Ό μ¬μ©νλ©΄ λ°νμμ μΈμ€ν΄μ€μ μ€μ νμ μ νμΈν μ μμ΅λλ€:
var movieCount = 0
var songCount = 0
for item in library {
if item is Movie {
movieCount += 1
} else if item is Song {
songCount += 1
}
}
print("λ―Έλμ΄ λΌμ΄λΈλ¬λ¦¬μλ \(movieCount)κ°μ μνμ \(songCount)κ°μ λ
Έλκ° μμ΅λλ€")
// μΆλ ₯: "λ―Έλμ΄ λΌμ΄λΈλ¬λ¦¬μλ 2κ°μ μνμ 3κ°μ λ
Έλκ° μμ΅λλ€"
μ¬κΈ°μ is μ°μ°μλ κ° itemμ΄ Movie μΈμ€ν΄μ€μΈμ§ λλ Song μΈμ€ν΄μ€μΈμ§ νμΈν©λλ€. μ΄λ₯Ό ν΅ν΄ λΌμ΄λΈλ¬λ¦¬ λ΄μ κ° λ―Έλμ΄ νμ μλ₯Ό κ³μ°ν μ μμ΅λλ€.
is μ°μ°μ: μΈμ€ν΄μ€κ° νΉμ νμ μ΄κ±°λ ν΄λΉ νμ μ νμ ν΄λμ€μΈ κ²½μ° trueλ₯Ό λ°ννκ³ , κ·Έλ μ§ μμΌλ©΄ falseλ₯Ό λ°νν©λλ€.
π λ€μ΄μΊμ€ν (as μ°μ°μ)
λ€μ΄μΊμ€ν μ ν΄λμ€ κ³μΈ΅ ꡬ쑰μμ μμ ν΄λμ€ νμ μ λ³μλ μμλ₯Ό νμ ν΄λμ€ νμ μΌλ‘ λ³ννλ κ³Όμ μ λλ€. Swiftμμλ λ κ°μ§ ννμ λ€μ΄μΊμ€ν μ μ 곡ν©λλ€:
1. μ‘°κ±΄λΆ λ€μ΄μΊμ€ν (as?)
for item in library {
if let movie = item as? Movie {
print("μν: \(movie.name), κ°λ
: \(movie.director)")
} else if let song = item as? Song {
print("λ
Έλ: \(song.name), μν°μ€νΈ: \(song.artist)")
}
}
// μΆλ ₯:
// μν: μΊμ¬λΈλμΉ΄, κ°λ
: λ§μ΄ν΄ 컀ν°μ¦
// λ
Έλ: λΈλ£¨ μ€μ¨μ΄λ μμ¦, μν°μ€νΈ: μλΉμ€ νλ μ¬λ¦¬
// μν: μν°μ¦ μΌμΈ, κ°λ
: μ€μ¨ μ°μ€
// λ
Έλ: λ μ μ€ μ¨λ¦¬, μν°μ€νΈ: 체μ€λ νΈν¬μ€
// λ
Έλ: λ€λ² κ³ λ κΈ°λΈ μ μ
, μν°μ€νΈ: λ¦ μ μ¬λ¦¬
as? μ°μ°μλ λ€μ΄μΊμ€ν μ μλνκ³ , μ±κ³΅νλ©΄ λ³νλ μ΅μ λ κ°μ λ°νν©λλ€. μ€ν¨νλ©΄ nilμ λ°νν©λλ€. μ΄λ₯Ό ν΅ν΄ μμ νκ² λ€μ΄μΊμ€ν μ μννκ³ , μ΅μ λ λ°μΈλ©(if let)κ³Ό ν¨κ» μ¬μ©νμ¬ μ±κ³΅μ μΌλ‘ λ³νλ κ²½μ°μλ§ μ½λλ₯Ό μ€νν μ μμ΅λλ€.
2. κ°μ λ€μ΄μΊμ€ν (as!)
let firstItem = library[0]
let movie = firstItem as! Movie // 첫 λ²μ§Έ νλͺ©μ΄ Movieμμ΄ νμ€ν λ
print("μν: \(movie.name), κ°λ
: \(movie.director)")
as! μ°μ°μλ κ°μ λ‘ λ€μ΄μΊμ€ν μ μνν©λλ€. μ€ν¨νλ©΄ λ°νμ μ€λ₯κ° λ°μνλ―λ‘, μΈμ€ν΄μ€κ° νΉμ νμ μμ΄ νμ€ν κ²½μ°μλ§ μ¬μ©ν΄μΌ ν©λλ€.
μ€μ: κ°λ₯νλ©΄ νμ μμ ν as?λ₯Ό μ¬μ©νκ³ , as!λ λ€μ΄μΊμ€ν μ΄ νμ μ±κ³΅ν κ²μ΄ νμ€ν κ²½μ°μλ§ μ¬μ©νμΈμ.
μ°Έκ³ : νμ μΊμ€ν μ μΈμ€ν΄μ€ μ체λ₯Ό λ³κ²½νμ§ μμ΅λλ€. λ¨μ§ ν΄λΉ μΈμ€ν΄μ€λ₯Ό μΌμμ μΌλ‘ λ€λ₯Έ νμ μΌλ‘ μ·¨κΈν λΏμ λλ€.
π Anyμ AnyObjectμ λν νμ μΊμ€ν
Swiftλ λΉνΉμ νμ μμ μ μν΄ λ κ°μ§ νΉλ³ν νμ μ μ 곡ν©λλ€:
- Any: ν¨μ νμ μ ν¬ν¨ν λͺ¨λ νμ μ μΈμ€ν΄μ€λ₯Ό λνλΌ μ μμ΅λλ€.
- AnyObject: λͺ¨λ ν΄λμ€ νμ μ μΈμ€ν΄μ€λ₯Ό λνλΌ μ μμ΅λλ€.
μ΄λ¬ν νμ μ λ§€μ° μ μ°νμ§λ§, νμ μμ μ±μ΄ λ¨μ΄μ§λ―λ‘ κΌ νμν κ²½μ°μλ§ μ¬μ©ν΄μΌ ν©λλ€.
Any νμ μ¬μ© μμ :
var things: [Any] = []
things.append(0) // Int
things.append(0.0) // Double
things.append(42) // Int
things.append(3.14159) // Double
things.append("μλ
νμΈμ") // String
things.append((3.0, 5.0)) // (Double, Double) νν
things.append(Movie(name: "κ³ μ€νΈλ²μ€ν°μ¦", director: "μμ΄λ° λΌμ΄νΈλ§"))
things.append({ (name: String) -> String in "μλ
, \(name)" }) // ν΄λ‘μ
ν¨ν΄ λ§€μΉμΌλ‘ Any νμ μ κ° μ²λ¦¬νκΈ°:
for thing in things {
switch thing {
case 0 as Int:
print("Int νμ
μ 0")
case 0 as Double:
print("Double νμ
μ 0")
case let someInt as Int:
print("Int κ°: \(someInt)")
case let someDouble as Double where someDouble > 0:
print("μμ Double κ°: \(someDouble)")
case is Double:
print("μΆλ ₯νκ³ μΆμ§ μμ λ€λ₯Έ Double κ°")
case let someString as String:
print("λ¬Έμμ΄ κ°: \"\(someString)\"")
case let (x, y) as (Double, Double):
print("μ’ν: (\(x), \(y))")
case let movie as Movie:
print("\(movie.director) κ°λ
μ μν \(movie.name)")
case let stringConverter as (String) -> String:
print(stringConverter("λ§μ΄ν΄"))
default:
print("κΈ°ν λ€λ₯Έ κ²")
}
}
// μΆλ ₯:
// Int νμ
μ 0
// Double νμ
μ 0
// Int κ°: 42
// μμ Double κ°: 3.14159
// λ¬Έμμ΄ κ°: "μλ
νμΈμ"
// μ’ν: (3.0, 5.0)
// μμ΄λ° λΌμ΄νΈλ§ κ°λ
μ μν κ³ μ€νΈλ²μ€ν°μ¦
// μλ
, λ§μ΄ν΄
μ΄ μμ λ switch λ¬Έκ³Ό ν¨ν΄ λ§€μΉμ μ¬μ©νμ¬ Any νμ λ°°μ΄μ λ€μν κ°μ μ²λ¦¬νλ λ°©λ²μ 보μ¬μ€λλ€. as ν¨ν΄μ μ¬μ©νμ¬ κ°μ νΉμ νμ μΌλ‘ μΊμ€ν νκ³ , is ν¨ν΄μΌλ‘ νμ μ νμΈν©λλ€.
μ΅μ λκ³Ό Any νμ
μ΅μ λ κ°μ Any νμ μΌλ‘ μ¬μ©ν λλ μ£Όμκ° νμν©λλ€:
let optionalNumber: Int? = 3
things.append(optionalNumber) // κ²½κ³ λ°μ
things.append(optionalNumber as Any) // κ²½κ³ μμ
μ΅μ λ μμ²΄κ° κ°μ΄λ―λ‘, Anyμ μ΅μ λμ μΆκ°ν λλ as Anyλ‘ λͺ μμ μΌλ‘ μΊμ€ν ν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ Swiftλ μ΅μ λμ λνλ κ°μ Anyλ‘ λ³ννλ €κ³ μλνλ©°, μ΄λ μλνμ§ μμ κ²°κ³Όλ₯Ό κ°μ Έμ¬ μ μμ΅λλ€.
π νμ μΊμ€ν μ μ€μ μμ©
1. λ€νμ± κ΅¬ν
class Shape {
func area() -> Double { return 0.0 }
}
class Circle: Shape {
var radius: Double
init(radius: Double) { self.radius = radius }
override func area() -> Double { return .pi * radius * radius }
}
class Rectangle: Shape {
var width: Double
var height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
}
override func area() -> Double { return width * height }
}
let shapes: [Shape] = [Circle(radius: 2.0), Rectangle(width: 3.0, height: 4.0)]
for shape in shapes {
print("λ©΄μ : \(shape.area())")
if let circle = shape as? Circle {
print("μμ λ°μ§λ¦: \(circle.radius)")
} else if let rectangle = shape as? Rectangle {
print("μ§μ¬κ°νμ ν¬κΈ°: \(rectangle.width) x \(rectangle.height)")
}
}
2. νλ‘ν μ½ μ€μ νμΈ
protocol Flyable {
func fly()
}
class Bird {
var name: String
init(name: String) { self.name = name }
}
class Eagle: Bird, Flyable {
func fly() {
print("\(name)μ΄(κ°) λμ΄ λ μκ°λλ€")
}
}
class Penguin: Bird {
// λ μ μμ
}
let birds: [Bird] = [Eagle(name: "λ
μ리"), Penguin(name: "νκ·")]
for bird in birds {
if let flyableBird = bird as? Flyable {
flyableBird.fly()
} else {
print("\(bird.name)μ(λ) λ μ μμ΅λλ€")
}
}
π νμ μΊμ€ν μ¬μ© μ μ£Όμμ¬ν
- κ°λ₯νλ©΄ as? μ¬μ©νκΈ°: κ°μ λ€μ΄μΊμ€ν (as!)μ μ€ν¨ μ λ°νμ μ€λ₯λ₯Ό λ°μμν€λ―λ‘, νμ€νμ§ μμ κ²½μ° νμ μ‘°κ±΄λΆ λ€μ΄μΊμ€ν (as?)μ μ¬μ©νμΈμ.
- νμ μΊμ€ν μ΅μννκΈ°: νμ μΊμ€ν μ λ°νμ λΉμ©μ΄ λ€κ³ μ½λλ₯Ό λ νμ μμ νκ² λ§λλλ€. κ°λ₯νλ©΄ μ λ€λ¦μ΄λ νλ‘ν μ½ μ§ν₯ νλ‘κ·Έλλ°μ νμ©νμ¬ νμ μΊμ€ν μ νμμ±μ μ€μ΄μΈμ.
- Anyμ AnyObject μ μ€νκ² μ¬μ©νκΈ°: μ΄λ¬ν νμ μ νμ μμ μ±μ μ νμν€λ―λ‘, μ λ§ νμν κ²½μ°μλ§ μ¬μ©νμΈμ.
- ν¨ν΄ λ§€μΉ νμ©νκΈ°: switch λ¬Έμμ isμ as ν¨ν΄μ μ¬μ©νλ©΄ νμ κ²μ¬μ μΊμ€ν μ λ κ°κ²°νκ² μ²λ¦¬ν μ μμ΅λλ€.
π μ 리
Swiftμ νμ μΊμ€ν μ ν΄λμ€ κ³μΈ΅ ꡬ쑰 λ° νλ‘ν μ½ μ€μμ λν μ μ°ν μμ μ κ°λ₯νκ² νλ κ°λ ₯ν λꡬμ λλ€. is μ°μ°μλ‘ νμ μ νμΈνκ³ , as?μ as! μ°μ°μλ‘ νμ μ λ³νν μ μμ΅λλ€.
λν Anyμ AnyObject νμ μ μ¬μ©νλ©΄ λ§€μ° λ€μν νμ μ κ°μ λ€λ£° μ μμ§λ§, μ΄λ νμ μμ μ±μ ν¬μμν€λ λκ°λ‘ μ»λ μ μ°μ±μ΄λ―λ‘ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€.
'π₯ Bread Basics > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Swift 곡μ λ¬Έμ μ 리 - μ λλ¦ (Generics) (0) | 2025.04.13 |
---|---|
Swift 곡μ λ¬Έμ μ 리 - νλ‘ν μ½ (Protocols) (0) | 2025.04.13 |
Swift 곡μ λ¬Έμ μ 리 - νμ₯ (Extensions) (0) | 2025.04.13 |
Swift 곡μ λ¬Έμ μ 리 - μ€μ²©λ νμ (Nested Types) (1) | 2025.04.12 |
Obj-C 곡μ λ¬Έμ μ 리 - κ°μ²΄, ν΄λμ€, λ©μμ§ (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - λ§€ν¬λ‘ (Macros) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - λμμ± (Concurrency) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μλ¬ μ²λ¦¬ (Error Handling) (0) | 2025.04.11 |