타입캐스팅
스위프트의 타입캐스팅은 인스턴스의 타입을 확인하는 용도 또는 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도로 사용합니다. is, as를 사용합니다.
타입 캐스팅 예제를 위한 클래스 정의
class Person { var name: String = "" func breath() { print("숨을 쉽니다") } } class Student: Person { var school: String = "" func goToSchool() { print("등교를 합니다") } } class UniversityStudent: Student { var major: String = "" func goToMT() { print("멤버쉽 트레이닝을 갑니다 신남!") } }
예제를 위한 인스턴스 생성
var yagom: Person = Person() var hana: Student = Student() var jason: UniversityStudent = UniversityStudent()
타입 확인
is를 사용하여 타입을 확인합니다.
var result: Bool result = yagom is Person // true result = yagom is Student // false result = yagom is UniversityStudent // false result = hana is Person // true result = hana is Student // true result = hana is UniversityStudent // false result = jason is Person // true result = jason is Student // true result = jason is UniversityStudent // true if yagom is UniversityStudent { print("yagom은 대학생입니다") } else if yagom is Student { print("yagom은 학생입니다") } else if yagom is Person { print("yagom은 사람입니다") } // yagom은 사람입니다 switch jason { case is Person: print("jason은 사람입니다") case is Student: print("jason은 학생입니다") case is UniversityStudent: print("jason은 대학생입니다") default: print("jason은 사람도, 학생도, 대학생도 아닙니다") } // jason은 사람입니다 switch jason { case is UniversityStudent: print("jason은 대학생입니다") case is Student: print("jason은 학생입니다") case is Person: print("jason은 사람입니다") default: print("jason은 사람도, 학생도, 대학생도 아닙니다") } // jason은 대학생입니다
업 캐스팅
as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줍니다. Any 혹은 AnyObject로도 타입정보를 변환할 수 있습니다. 암시적으로 처리되므로 꼭 필요한 경우가 아니라면 생략해도 무방합니다.
// UniversityStudent 인스턴스를 생성하여 Person 행세를 할 수 있도록 업 캐스팅 var mike: Person = UniversityStudent() as Person var jenny: Student = Student() //var jina: UniversityStudent = Person() as UniversityStudent // 컴파일 오류 // UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 업 캐스팅 var jina: Any = Person() // as Any 생략가능
다운 캐스팅
as? 또는 as!를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해줍니다.
조건부 다운 캐스팅
as?를 사용합니다. 캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 nil을 반환하기 때문에 결과의 타입은 옵셔널 타입입니다.
var optionalCasted: Student? optionalCasted = mike as? UniversityStudent optionalCasted = jenny as? UniversityStudent // nil optionalCasted = jina as? UniversityStudent // nil optionalCasted = jina as? Student // nil
강제 다운 캐스팅
as!를 사용합니다. 캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 런타임 오류가 발생합니다. 캐스팅에 성공하면 옵셔널이 아닌 일반 타입을 반환합니다.
var forcedCasted: Student optionalCasted = mike as! UniversityStudent //optionalCasted = jenny as! UniversityStudent // 런타임 오류 //optionalCasted = jina as! UniversityStudent // 런타임 오류 //optionalCasted = jina as! Student // 런타임 오류
활용
func doSomethingWithSwitch(someone: Person) { switch someone { case is UniversityStudent: (someone as! UniversityStudent).goToMT() case is Student: (someone as! Student).goToSchool() case is Person: (someone as! Person).breath() } } doSomethingWithSwitch(someone: mike as Person) // 멤버쉽 트레이닝을 갑니다 신남! doSomethingWithSwitch(someone: mike) // 멤버쉽 트레이닝을 갑니다 신남! doSomethingWithSwitch(someone: jenny) // 등교를 합니다 doSomethingWithSwitch(someone: yagom) // 숨을 쉽니다 func doSomething(someone: Person) { if let universityStudent = someone as? UniversityStudent { universityStudent.goToMT() } else if let student = someone as? Student { student.goToSchool() } else if let person = someone as? Person { person.breath() } } doSomething(someone: mike as Person) // 멤버쉽 트레이닝을 갑니다 신남! doSomething(someone: mike) // 멤버쉽 트레이닝을 갑니다 신남! doSomething(someone: jenny) // 등교를 합니다 doSomething(someone: yagom) // 숨을 쉽니다
관련문서
The Swift Programming Language - Type Casting
by yagom
facebook : http://www.facebook.com/yagomSoft
facebook group : https://www.facebook.com/groups/yagom/
p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.
RSS Feed 받기
↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓
'Swift > 기본문법' 카테고리의 다른 글
프로토콜 (0) | 2017.07.17 |
---|---|
assert와 guard (0) | 2017.07.13 |
옵셔널 체이닝 (2) | 2017.07.06 |
인스턴스의 생성과 소멸 (0) | 2017.07.03 |
상속 (0) | 2017.06.29 |