티스토리 뷰
programming/Swift
[Swift/iOS] 타입캐스팅(1) - 타입 변환, 타입캐스팅, 데이터 타입 확인, 메타 타입, 메타 타입 타입
마들브라더 2022. 8. 26. 00:14스위프트는
- 데이터 타입 안전을 위해서 서로 다른 타입끼리의 값 교환을 제한함
1. 기존 언어의 타입 변환과 스위프트 타입 변환
- 실패할 수 있는 이니셜라이져
// 실패 할 수 있는 이니셜라이져
var string:Value String = "000111222"
var integerValue: Int? = Int(stringValue)
print(integerValue) // Optional(111222)
stringValue = "AAA000111"
integerValue = Int(stringValue)
print(integerValue) // nil
2. 스위프트 타입캐스팅
- 스위프트의 타입캐스팅은 인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스턴스인양 행세할 수 있는 방법
- is와 as로 타입을 확인하거나 다른 타입으로 전환(cast)할 수 있음
- 프로토콜 준수 여부 확인 가능
class Car {
let name: String
let door: Int
var description: String {
return "\(name) is \(String(door))door car"
}
init(door:Int) {
self.name = "Car"
self.door = door
}
}
class Z4: Car {
var price: Int
override var description: String {
return "\(name) has \(String(door)) door and price is \(String(price))만원"
}
init(door: Int, price: Int) {
self.price = price
super.init(door: door)
}
}
class EV6: Car {
var speed: String
override var description: String {
return "\(name) has \(String(door)) door and \(speed) speed"
}
init(door: Int, speed: String) {
self.speed = speed
super.init(door: door)
}
}
- Z4 와 EV6는 Car 클래스를 상속
- Car의 프로퍼티를 Z4와 EV6가 가지고 있음
- Car는 Z4나 EV6인 척 할 수 없지만, Z4와 EV6는 Car인 척 할 수 있음
→ Z4와 EV6는 Car의 모든 특성을 가지고 있기 때문
3. 데이터 타입 확인
- is를 사용하여 인스턴스가 어떤 클래스의 인스턴스인지 타입을 확인할 수 있음
- 인스턴스가 해당 클래스의 인스턴스거나 그 자식클래스의 인스턴스면 true, 그렇지 않으면 false 반환
let car: Car = Car(door: 5)
print(car.description) // Car is 5 door car
let myZ4: Z4 = Z4(door: 2, price: 8000)
print(myZ4.description) // Car has 2 door and price is 8000만원
let yourEV6 : EV6 = EV6(door: 5, speed: "fast")
print(yourEV6.description) // Car has 5 door and fast speed
print(car is Car) // true
print(car is Z4) // false
print(car is EV6) //false
print(myZ4 is Car) // true
print(yourEV6 is Car) // true
print(myZ4 is EV6) // false
print(yourEV6 is EV6) // true
- car는 Z4나 EV6가 될 수 없지만, myZ4나 yourEV6는 Car가 될 수 있음
- myZ4와 yourEV6는 서로 다른 타입
메타 타입(Meta Type) 타입
- 타입의 타입
- 클래스, 구조체, 열거형 타입 등 타입의 타입
- ‘타입 그 자체'가 하나의 타입으로 또 표현될 수 있음
- 타입의 이름 뒤에 .Tpye을 붙이면 메타 타입
- 프로토콜 타입의 메타 타입은 .Protocol
- .self를 사용하면 타입을 값으로 표현할 수 있음
- SomeClass.self 표현하면 SomeClass의 인스턴스가 아닌 SomeClass를 값으로 표현한 값을 반환
- SomProtocol.self이라고 표현하면 SomeProtocol을 준수하는 타입의 인스턴스가 아닌 SomeProtocol 프로토콜을 값으로 표현한 값 반환
protocol SomeProtocol { }
class SomeClass: SomeProtocol { }
let intType: Int.Type = Int.self
let stringType: String.Type = String.self
let classType: SomeClass.Type = SomeClass.self
let protocolProtocol: SomeProtocol.Protocol = SomeProtocol.self
var someType: Any.Type
someType = intType
print(someType) // Int
someType = stringType
print(someType) // String
someType = classType
print(someType) // SomeClass
someType = protocolProtocol // SomeProtocol
print(someType)
- 인스턴스 self와 타입 self
- .self 표현은 값 뒤에 써주면 그 값 자신을 반환
- 타입 이름 뒤에 써주면 타입을 표현하는 값을 반환
- “stringValue”.self 는 “stringValue”를, String.self는 String 타입 그 자체
'programming > Swift' 카테고리의 다른 글
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 강한 참조 순환
- authorizationCode
- unowned
- CoreData
- escaping closrue
- 클로저표현
- 토큰저장
- 클로저 축약
- Core Data Stack
- ASAuthorizationAppleIDCredential
- context
- Entity
- identity Token
- 클로저 강한 참조
- weak
- SWIFT
- 클로저
- object
- 메모리 안정성
- 캡쳐리스트
- 디자인패턴
- ios
- inout 파라미터 메모리 충돌
- Persistent Container
- Delegate 패턴
- 자동클로저
- core data
- 강한참조순환
- 회원가입
- autoclosure
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함