프로퍼티 옵저버
프로퍼티 옵저버는 프로퍼티의 값이 변경될 때 특정한 동작을 수행할 수 있게 해주는 기능이다.
프로퍼티의 값이 변경되기 전 (willSet) 과 변경된 후 (didSet) 에 호출됩니다. 이를 통해 값의 변화를 감지하고 추가 작업을 수행할 수 있다.
didSet
프로퍼티의 값이 변경된 후에 호출되는 옵저버, 이 옵저버는 이전 값과 새로운 값 사이의 변화를 감지하거나, 값에 따른 추가적인 동작을 수행할 수 있다. 매개변수로는 변경되기 전의 값이 전달된다.
willSet
프로퍼티의 값이 변경되기 전에 호출되는 옵저버, 이 옵저버는 새로운 값이 어떤 것인지 파악하거나, 변경 전 상태를 저장하는 등 작업을 수행할 수 있다. 매개변수로는 변경될 값이 전달된다.
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("새로운 값을 입력 \\(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \\(totalSteps - oldValue) steps")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
stepCounter.totalSteps = 360
타입 캐스팅
타입 캐스팅은 swift 에서 하나의 데이터 타입을 다른 데이터 타입으로 변환하는 프로세스를 의미한다. 이는 코드에서 다른 데이터 타입으로의 변환이 필요한 경우 유용하게 사용된다.
업캐스팅(Upcasting)
- 서브클래스의 타입을 슈퍼클래스 타입으로 캐스팅하는 것
- 슈퍼클래스 타입에는 서브클래스의 모든 멤버가 포함되지 않을 수 있다.
- 안전하게 이루어지는 캐스팅
class Aniaml {}
class Dog: Animal {}
let dog = Dog()
let animal: Animal = dog // Upcasting
다운캐스팅(Downcasting)
- 슈퍼클래스 타입의 인스턴스를 서브클래스 타입으로 캐스팅 하는 것
- 다운캐스팅은 항상 옵셔널 타입으로 반환 된다.
- 다운캐스팅 시 원래 타입이 캐스팅하려는 타입과 일치하지 않으면 런타임 오류가 발생한다.
let animal = Animal()
if let dog = animal as? Dog {
print("Dog로 성공적인 다운캐스팅")
} else {
print("Dog로 다운캐스팅 실패")
}
강제 다운캐스팅(Forced Downcasting)
- as 연산자를 사용하여 강제로 다운 캐스팅
- 강제 다운캐스팅은 옵셔널로 반환하지 않아 nil 값으로 반환이 불가하다.
- 다운캐스팅에 실패 시 런타임 오류 발생
let animal = Animal()
let dog = animal as! Dog
is 연산자
is 연산자를 사용하여 인스턴스가 특정 클래스의 인스턴스인지 확인할 수 있다.
If someInstance is Dog {
print("someInstance 는 Dog 클래스의 인스턴스 입니다.")
}
as 연산자
let dog = Dog()
let animal: Animal = dog as Animal // 업캐스팅
위 코드에서 dog 인스턴스를 Animal 타입으로 업캐스팅하고 있다.
이 경우 Dog 클래스가 Animal 클래스의 서브클래스 이기 때문에 가능
let animal = Animal()
if let dog = animal as? Dog {
//다운캐스팅에 성공한 경우
print("성공적")
} else {
//다운캐스팅에 실패한 경우
print("실패")
}
위 코드에서 as 연산자는 다운캐스팅을 시도하고 실패할 경우 nil 로 반환한다.
따라서 if let 구문을 사용하여 옵셔널 바인딩을 수행
let animal = Animal()
let dog = animal as! Dog // 강제 다운캐스팅
위의 코드에서 as! 연산자는 강제 다운캐스팅을 수행한다.
만약 다운캐스팅에 실패하면 런타임 오류가 발생하므로 주의
as 연산자는 업캐스팅과 다운캐스팅 모두 사용되며, 컴파일러에게 캐스팅을 명시적으로 지정한다.
'◽️ Programming > T I L' 카테고리의 다른 글
Swift TIL ( 예외처리 , ARC , 프로토콜 , Extension) (0) | 2024.03.12 |
---|---|
접근 제한자 , mutating , 클로저 , 고차함수 (0) | 2024.03.11 |
델리게이트 패턴 , 텍스트 필드 (0) | 2024.03.07 |
Swift (옵셔널 체이닝, Queue , Stack , Set , Overloading) (2) | 2024.03.06 |
Swift Tuple, Any, Character / mini project (0) | 2024.03.05 |