Type Casting Doc를 참조하여 작성하였습니다.
정의
값의 런타임 타입을 정하고 타입의 정보를 제공한다.
타입 캐스팅이란 인스턴스의 타입을 확인하고나 해당 인스턴스를
자체 클래스 계층 구조의 다른 곳에서 다른 상위 클래스 또는 하위 클래스로 취급하는 방법이다.
Swift에서 타입 캐스팅은 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: "Casablanca", director: "Michael Curtiz"),
Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
Movie(name: "Citizen Kane", director: "Orson Welles"),
Song(name: "The One And Only", artist: "Chesney Hawkes"),
Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
]
상위 클래스 MediaItem
을 정의하고 MediaItem
을 상속받는 하위클래스 Movie
, Song
을 정의했습다.
library
라는 상수를 정의해주고 안에 Movie
, Song
타입을
인스턴스화 시켜서 정의하게 되면 library
는 어떤 타입일까요?
print("library의 타입은? \(type(of: library))")
// library의 타입은? Array<MediaItem>
공식문서에 따르면 Swift의 타입검사기는 Movie
와 Song
이 MediaItem
를
상위클래스를 공통적으로 가지고 있으므로 library 배열에 대해 Array<MediaItem>
로 추론할 수 있다고 하네요.
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("Media library contains \(movieCount) movies and \(songCount) songs")
// Prints "Media library contains 2 movies and 3 songs"
is
연산자는 타입을 체크할때 활용할 수 있습니다.
반환타입은 Bool
타입입니다.
as 활용법
as
연산자는 두가지 방법으로 활용할 수 있습니다.
1. Down Cating
as?
와 as!
로 다운캐스팅을 할 수 있습니다.
- as?
다운캐스팅을 시도합니다. 결과를 옵셔널 타입으로 반환합니다. 실패한경우 nil을 반환합니다. 이를 통해서 다운캐스팅의 성공여부를 확인할 수 있습니다.
다운캐스팅이 성공할지 확신할 수 없는 경우 사용합니다.
- as!
다운캐스팅 성공에 확신이 있을 경우만 사용합니다. 결과를 옵셔널을 해제하고 반환합니다.
다만, 실패할 경우 런타임에러가 발생하기 때문에 사용을 지양하는 것이 좋을 것 같습니다.
for item in library {
if let movie = item as? Movie {
print("Movie: \(movie.name), dir. \(movie.director)")
} else if let song = item as? Song {
print("Song: \(song.name), by \(song.artist)")
}
}
// Movie: Casablanca, dir. Michael Curtiz
// Song: Blue Suede Shoes, by Elvis Presley
// Movie: Citizen Kane, dir. Orson Welles
// Song: The One And Only, by Chesney Hawkes
// Song: Never Gonna Give You Up, by Rick Astley
2. Up Casting
하위클래스에서 상위클래스로 형식을 변환할 때 사용합니다.
업캐스팅할 타입을 작성해주지 않아도 컴파일러가 자동으로
타입을 추론할 수 있지만 as를 활용해서 타입을 지정하여 업캐스팅을 할 수 있습니다.
class Animal {
func makeSound() {
print("Generic animal sound")
}
}
class Dog: Animal {
override func makeSound() {
print("Woof!")
}
}
as를 활용한 Up Casting
let animal = Animal()
if let dog = animal as? Dog { // downcasting
print("animal is a Dog")
} else {
print("animal is not a Dog")
}
타입 추론을 통한 Up Casting
let myDog = Dog()
let myAnimal: Animal = myDog
'Swift' 카테고리의 다른 글
Swift - 컴플리션 핸들러를 async로 감싸기 (0) | 2024.01.22 |
---|---|
Swift - Optional과 Optional Binding (1) | 2023.12.29 |
Swift - [weak self] 톺아보기 (0) | 2023.12.21 |
Swift - ARC 톺아보기 (0) | 2023.12.14 |
iOS 공부하는 중🌱