반응형
안녕하세요 공공돌🧸 입니다.
타입 캐스팅에 대해 정리 해봤습니다.
1. 타입 캐스팅
1. 스위프트 타입 캐스팅
- 인스턴스의 타입을 확인 하는 용도
- 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인 하는 용도
- is, as를 사용합니다.
📝 형변환은 'ex. let someDouble = Double(2)' 타입 캐스팅이 아니라 새로운 값을 생성하는 것입니다.
2. 예제 클래스
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()
3. 타입확인
is를 사용하여 타입을 확인합니다.
var result: Bool
result = bin is Person // true
result = bin is Student // false
result = bin is UniversityStudent // false
result = sik is Person // true
result = sik is Student // true
result = sik is UniversityStudent // false
result = mungchi is Person // true
result = mungchi is Student // true
result = mungchi is UniversityStudent // true
if bin is UniversityStudent {
print("bin은 대학생입니다")
} else if bin is Student {
print("bin 학생입니다")
} else if bin is Person {
print("bin 사람입니다")
} // bin 사람입니다
switch mungchi {
case is Person:
print("mungchi 사람입니다")
case is Student:
print("mungchi 학생입니다")
case is UniversityStudent:
print("mungchi 대학생입니다")
default:
print("mungchi 사람도, 학생도, 대학생도 아닙니다")
} // mungchi 사람입니다
switch mungchi {
case is UniversityStudent:
print("mungchi 대학생입니다")
case is Student:
print("mungchi 학생입니다")
case is Person:
print("mungchi 사람입니다")
default:
print("mungchi 사람도, 학생도, 대학생도 아닙니다")
} // mungchi 대학생입니다
3. 업 캐스팅(Up Casting)
- as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줍니다.
- Any 혹은 AnyObject로도 타입정보를 변환할 수 있습니다.
- 암시적으로 처리되므로 꼭 필요한 경우가 아니라면 생략해도 무방합니다.
// UniversityStudent 인스턴스를 생성하여 Person 행세를 할 수 있도록 업 캐스팅
var bin: Person = UniversityStudent() as Person
var sik: Student = Student()
//var sik: UniversityStudent = Person() as UniversityStudent // 컴파일 오류
// UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 업 캐스팅
var mungchi: Any = Person() // as Any 생략가능
4. 다운 캐스팅(Down Casting)
as? 또는 as!를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해줍니다.
A. 조건부 다운 캐스팅
- as?를 사용합니다.
- 캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 nil을 반환하기 때문에 결과의 타입은 옵셔널 타입입니다.
var optionalCasted: Student?
optionalCasted = bin as? UniversityStudent
optionalCasted = sik as? UniversityStudent // nil
optionalCasted = mungchi as? UniversityStudent // nil
optionalCasted = mungchi as? Student // nil
B. 강제 다운 캐스팅
- as!를 사용합니다.
- 캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 런타임 오류가 발생합니다.
- 캐스팅에 성공하면 옵셔널이 아닌 일반 타입을 반환합니다.
var forcedCasted: Student
forcedCasted = bin as! UniversityStudent
//forcedCasted = sik as! UniversityStudent // 런타임 오류
//forcedCasted = mungchi as! UniversityStudent // 런타임 오류
//forcedCasted = mungchi as! Student // 런타임 오류
5. 활용
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: bin as Person) // 멤버쉽 트레이닝을 갑니다 신남!
doSomethingWithSwitch(someone: bin) // 멤버쉽 트레이닝을 갑니다 신남!
doSomethingWithSwitch(someone: sik) // 등교를 합니다
doSomethingWithSwitch(someone: mungchi) // 숨을 쉽니다
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: bin as Person) // 멤버쉽 트레이닝을 갑니다 신남!
doSomething(someone: bin) // 멤버쉽 트레이닝을 갑니다 신남!
doSomething(someone: sik) // 등교를 합니다
doSomething(someone: mungchi) // 숨을 쉽니다
공부하는 공돌이, 공공돌입니다🐻
@sheep1sik
출처 : 야곰 iOS 프로그래밍을 위한 스위프트 기초
반응형
'iOS > Swift 기초' 카테고리의 다른 글
[ Swift 기초 ] 프로토콜 (1) | 2024.01.22 |
---|---|
[ Swift 기초 ] assert / guard (1) | 2024.01.21 |
[ Swift 기초 ] 옵셔널 체이닝과 nil 병합 (1) | 2024.01.19 |
[ Swift 기초 ] 인스턴스의 생성과 소멸 ( init / deinit ) (1) | 2024.01.18 |
[ Swift 기초 ] 상속 (1) | 2024.01.17 |