1. 스위프트 타입 캐스팅
•인스턴스의 타입을 확인하는 용도
•클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도
•is, as를 사용
* 형변환은 'ex. let someDouble = Double(2)' 타입 캐스팅이 아니라 새로운 값을 생성하는 것
2. 예제 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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("멤버쉽 트레이닝을 갑니다 신남!") } } | cs |
1 2 3 4 | // 인스턴스 생성 var jinun: Person = Person() var jennie: Student = Student() var lisa: UniversityStudent = UniversityStudent() | cs |
2. 타입확인
is를 사용하여 타입을 확인합니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | var result: Bool result = jinun is Person // true result = jinun is Student // false result = jinun is UniversityStudent // false result = jennie is Person // true result = jennie is Student // true result = jennie is UniversityStudent // false result = lisa is Person // true result = lisa is Student // true result = lisa is UniversityStudent // true if jinun is UniversityStudent { print("jinun은 대학생입니다") } else if jinun is Student { print("jinun은 학생입니다") } else if jinun is Person { print("jinun은 사람입니다") } // jinun은 사람입니다 switch jennie { case is Person: print("jennie는 사람입니다") case is Student: print("jennie는 학생입니다") case is UniversityStudent: print("jennie는 대학생입니다") default: print("jennie는 사람도, 학생도, 대학생도 아닙니다") } // jennie는 사람입니다 switch lisa { case is University: print("lisa는 대학생입니다") case is Student: print("lisa는 학생입니다") case is Person: print("lisa는 사람입니다") default: print("lisa는 사람도, 학생도, 대학생도 아닙니다") } // lisa는 대학생입니다 | cs |
3. 업 캐스팅(Up Casting)
•as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줌
•Any 혹은 AnyObject로도 타입정보를 변환할 수 있음
•암시적으로 처리되므로 꼭 필요한 경우가 아니라면 생략해도 무방
1 2 3 4 5 6 7 8 | // UniversityStudent 인스턴스를 생성하여 Person 행세를 할 수 있도록 업 캐스팅 var rose: Person = UniversityStudent() as Person var jennie: Student = Student() //var jisoo: UniversityStudent = Person() as UniversityPerson // 컴파일 오류 // UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 업 캐스팅 var jisoo: Any = Person() // as Any | cs |
4. 다운 캐스팅(Down Casting)
as? 또는 as!를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해줌
A. 조건부 다운 캐스팅
•as?를 사용함
•캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 nil을 반환하기 때문에 결과의 타입은 옵셔널 타입임
1 2 3 4 5 6 | var optionalCasted: Student? optionalCasted = jennie as? UniversityStudent optionalCasted = jisoo as? UniversityStudent // nil optionalCasted = lisa as? UniversityStudent // nil optionalCasted = rose as? Student // nil | cs |
B. 강제 다운 캐스팅
•as!를 사용
•캐스팅에 실패하면, 즉 캐스팅하려면 타입에 부합하지 않는 인스턴스라면 런타임 오류가 발생함
•캐스팅에 성공하면 옵셔널이 아닌 일반 타입을 반환
1 2 3 4 5 6 | var forcedCasted: Student optionalCasted = rose as! UniversityStudent //optionalCasted = jennie as! UniversityStudent // 런타임 오류 //optionalCasted = jisoo as! UniversityStudent // 런타임 오류 //optionalCasted = jisoo as! UniversityStudent // 런타임 | cs |
5. 활용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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: lisa as Person) // 멤버쉽 트레이닝을 갑니다 신남! doSomethingWithSwitch(someone: lisa) // 멤버쉽 트레이닝을 갑니다 신남! doSomethingWithSwitch(someone: jennie) // 등교를 합니다 doSomethingWithSwitch(someone: jinun) // 숨을 쉽니다 func doSomething(someone: Person) { if let universityStudent = someone as? UniversityStudent { universityStudent.goToMT() } else if let stuent = someone as? Student { student.goToSchool() } else if let person = someone as? Person { person.breath() } } doSomething(someone: lisa as Person) // 멤버쉽 트레이닝을 갑니다 신남! doSomething(someone: lisa) // 멤버쉽 트레이닝을 갑니다 신남! doSomething(someone: jennie) // 등교를 합니다 doSomething(someone: jinun) // 숨을 | cs |
제 나름대로 생각을 정리하며 포스팅합니다.
정보전달에 있어 차질이 생기는 것을 우려해 나름대로 확실하게 검증을 하고 포스팅하려고 노력합니다.
본 포스팅에 잘못된 정보가 있거나 수정해야할 내용이 있다면 댓글 또는 아래의 이메일로 알려주시면 감사하겠습니다.
E-mail : silent_lhr@naver.com
공감은 로그인이 필요없습니다.
공감은 저에게 포스팅을 이어나갈 수 있는 힘이 됩니다.
'프로그래밍 [KOR] > Swift' 카테고리의 다른 글
Swift의 프로토콜(Protocol) (0) | 2018.10.19 |
---|---|
Swift의 assert와 guard (0) | 2018.10.18 |
Swift의 옵셔널 체이닝과 nil 병합 연산자 (0) | 2018.10.17 |
Swift의 인스턴스의 생성과 소멸 (0) | 2018.10.15 |
Swift의 상속 (0) | 2018.10.11 |