티스토리 뷰
타입캐스팅은 인스턴스의 타입을 확인하거나 인스턴스를 같은 계층에 있는 다른 superClass나 subClass로 취급하는 방법이다. 타입캐스팅에는 is와 as 두 연산자를 사용한다.
바로 확인해보자.
1. 타입캐스팅을 위한 클래스 계층 구조 선언
타입캐스팅의 동작을 확인하기 위해 클래스를 하나 만들어보자.
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)
}
}
부모 클래스인 MediaItem이라는 클래스를 선언하고 이를 상속 받은 자식 클래스인 Movie와 Song을 생성했다. Movie와 Song은 각각 가지고 있는 프로퍼티의 이름이 다르다.
이제 이 Movie와 Song을 에리멘트로 갖는 library 배열을 아래와 같이 선언했다.
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")
]
// the type of "library" is inferred to be [MediaItem]
library가 가지고 있는 Movie와 Song 인스턴스의 공통 분모는 MidiaItem이기 때문에 library는 타입 추론에 의해 [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
}
}
- 다운 캐스팅
특정 클래스 타입의 상수나 변수는 특정 서브클래스의 인스턴스를 참조하고 있을 수 있다. as? 와 as! 연산자를 이용하여 어떤 타입의 인스턴스인지 확인할 수 있다. as? 는 특정 타입이 맞는 지 확신할 수 없을 때 사용하며, 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
만약 as! 로 다운캐스팅을 하였는데 해당 타입이 아닐 경우에는 런타임 에러가 발생한다.
- Any, AnyObject 의 타입 캐스팅
swift에서는 두가지 특별한 타입을 제공한다.
1) Any: 함수 타입을 포함하여 모든 타입을 나타낸다.
2) AnyObject: 모든 클래스 타입의 인스턴스를 나타낸다.
var things = [Any]()
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append("hello")
things.append((3.0, 5.0))
things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman"))
things.append({ (name: String) -> String in "Hello, \(name)" })
for thing in things {
switch thing {
case 0 as Int:
print("zero as an Int")
case 0 as Double:
print("zero as a Double")
case let someInt as Int:
print("an integer value of \(someInt)")
case let someDouble as Double where someDouble > 0:
print("a positive double value of \(someDouble)")
case is Double:
print("some other double value that I don't want to print")
case let someString as String:
print("a string value of \"\(someString)\"")
case let (x, y) as (Double, Double):
print("an (x, y) point at \(x), \(y)")
case let movie as Movie:
print("a movie called \(movie.name), dir. \(movie.director)")
case let stringConverter as (String) -> String:
print(stringConverter("Michael"))
default:
print("something else")
}
}
'Mobile > ios' 카테고리의 다른 글
[ios] swift 기본 문법 정리 19: Extensions (0) | 2022.12.09 |
---|---|
[ios] swift 기본 문법 정리 18: Protocols (0) | 2022.12.08 |
[ios] swift 기본 문법 정리 16: Error Handling (0) | 2022.12.08 |
[ios] swift 기본 문법 정리 15: Optional Chaining (0) | 2022.12.07 |
[ios] swift 기본 문법 정리 14: DeInitialization (0) | 2022.12.07 |
- redux
- react
- 맛집
- javascript
- 인천 구월동 이탈리안 맛집
- Promise
- AsyncStorage
- 정보보안기사 #실기 #정리
- 파니노구스토
- Async
- redux-thunk
- 이탈리안 레스토랑
- react-native
- 인천 구월동 맛집
- await
- Total
- Today
- Yesterday