[ 스터디01일차 ] swift 공부 의문점 정리

Woong·2022년 5월 7일
0

1.타입캐스팅을 공부하며

- 타입캐스팅의 is는 == 과 어떤점이 다른걸까?

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: "Butter", artist: "BTS"),
    Movie(name: "올드보이", director: "박찬욱"),
    Song(name: "Wonderwall", artist: "Oasis"),
    Song(name: "Rain", artist: "이적")
]

var movieCount = 0
var songCount = 0

for item in library {
    if item is Movie {
        movieCount += 1
    } else if item is Song {
        songCount += 1
    }
}

/* item(library를 포함하는)이라는 임시상수에서
 item이 Movie가 맞다면 movieCount를 1씩 증가시키라.
 아닐 경우, item이 Song이 맞다면 songCount를 1씩 증가시키라.
*/

print("Media library contains \(movieCount) movies and \(songCount) songs.")

의문점 : if문에서는 지금까지 항상 맞다면이라는 조건을 == 으로 써왔다.
근데 왜 여기선 is라고 표현을 해준것이 왜 아래와 같은 오류가 발생하게될까?

Binary operator '==' cannot be applied to operands of type 'MediaItem' and 'Movie.Type'
'MediaItem' 및 'Movie' 유형의 피연산자에 이진 연산자 '=='을 적용할 수 없습니다.

답변 :

  1. 스위프트의 타입 체커는 Movie 와 Song 이 공통적으로 MediaItem 을 부모클래스로 가지는 것을 알고 library 의 타입을 MediaItem 으로 타입추론함!!!
    따라서, 실제로 해당 배열에서 값을 꺼내서 쓸 때는 MediaItem으로 추출이 되기 때문에 Movie나 Song으로 사용하려면 다운캐스팅을 해주어야 함.
  1. is는 타입을 체크하는 연산자
    ==는 값을 단순히 체크하는 연산자


profile
https://github.com/iOS-Woong

0개의 댓글