[Swift] 타입 체킹, 타입 캐스팅 (is, as)

김상우·2021년 10월 27일
0

Keyword

  1. 타입 캐스팅
  2. is 키워드
  3. as 키워드

is : Checking Type

  • 표현식이 Type 과 동일하거나, 표현식이 Type의 서브 클래스인 경우 true

as : Casting Type

  • 업캐스팅
let human = Student.init() as Human

ksw를 Student 타입의 인스턴스로 생성하지만, Human 으로 업캐스팅한다.
업캐스팅은 컴파일 시점에 수행된다.

  • 다운캐스팅
let ksw: Student = human as! Student

근데 만약 Student 타입이 아닌 Teacher 타입 (다운 캐스팅 될 수 없는 다른 타입) 으로 캐스팅을 진행한다면 에러가 난다.
그래서 옵셔널을 사용한다.
as? 를 사용할 경우 런타임 시점에 다운 캐스팅하며, 실패시 nil을 반환한다.

  • 옵셔널 바인딩과 타입 캐스팅

    if let 바인딩 구문 예시

for person in people {
  if let student = person as? Student {
  	print("\(student).name : 학생입니다.")
  }
  else if let teacher = person as? Teacher {
  	print("\(teacher).name : 선생님입니다.")
  }
}

Swift 코드

// 타입 캐스팅
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)
    }
}

// 업캐스팅으로 Moive와 Song을 한 Array에 담음.
let library: [MediaItem] = [
    Movie(name: "기생충", director: "봉준호"),
    Song(name: "Butter", artist: "BTS"),
    Movie(name: "올드보이", director: "박찬욱"),
    Song(name: "StrawberryMoon", artist: "IU")
]

var movieCount = 0
var songCount = 0

for item in library {
    // 타입 캐스팅 is
    if item is Movie {
        movieCount += 1
    }
    else if item is Song {
        songCount += 1
    }
}

movieCount
songCount

// 다운 타입 캐스팅 as?
// as! 은 절대적으로 확실할때만 사용한다.
for item in library {
    // MediaItem 타입의 item을 각각 Moive, Song 타입으로 다운 캐스팅 한다.
    if let movie = item as? Movie {
        print("Movie : \(movie.name)")
    }
    else if let song = item as? Song {
        print("Song : \(song.name)")
    }
}
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글