大器晩成

타입캐스팅(Type Casting) 본문

iOS/Swift 문법

타입캐스팅(Type Casting)

zerobugpark 2024. 12. 19. 13:11
  • 인스턴스 타입을 검사 - is 연산자
  • 클래스 계층 상의 타입 변환 - as 연산자
class Person {
    var name = ""
    var age = 10
}

class Student: Person {
    var id = 1
    
}

class Undergradudate: Student {
    var major = "전자공학"
}

 

 

타입 비교 연산

- 인스턴스 타입을 검사하는 is 연산자 (type check operator)

 

인스턴스(또는 변수, 상수) is 비교 대상 타입 (이항연산자)

1. 연산자 왼쪽 인스턴스 타입이 연산자 오른쪽 비교 대상 타입과 일치할 경우 - true

2. 연산자 왼쪽 인스턴스의 타입이 연산자 오른쪽 비교 대상 타입의 하위 클래스일 경우 - true

3. 그 외 - false

 

let person = Person()
let student = Student()
let undergraduate = Undergraduate()


person is Person //true
person is Student //false
person is Undergraduate //false

student is Person  //true
student is Student // true
student is Undergraduate // false

undergraduate is Person // true
undergraduate is Student // true
undergraduate is Undergraduate // true
  • student는 Person의 하위 클래스이기 때문에 student is Person은 true입니다.
  • undergraduate는 Person과 Student의 하위 클래스이기 때문에 모든 상황에서 true입니다.

 

Apple 공식문서 예제

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")
]
// the type of "library" is inferred to be [MediaItem]

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"

 

728x90