일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- War Game
- ftz level13
- PHP
- windosws wbcs
- Stack
- web
- Java
- LoB
- 큐
- System
- 재귀
- 백준
- 두근두근 자료구조
- 암호수학
- OSI
- ftz
- windosw 문자열
- pwnable.kr
- 미로 탐색 알고리즘
- HTML
- SWiFT
- 스택
- 파이썬
- c언어
- 자료구조
- 정렬 알고리즘
- 파일 시스템
- level13
- 시간복잡도
- C
- Today
- Total
나의 기록, 현진록
[Swift] 10.1.4 프로퍼티 감시자 본문
스위프트 프로그래밍 3판 - 야곰 지음
프로퍼티 감시자를 사용하면 프로퍼티 값이 변경됨에 따라 적절한 작업을 취할 수 있습니다. 프로퍼티 감시자는 프로퍼티 값이 새로 할당될 때마다 호출됩니다. 이 때 변경되는 값이 현재의 값과 같더라도 호출합니다. 이 때 변경되는 값이 현재의 값과 같더라도 호출합니다.
프로퍼티 감시자는 저장 프로퍼티뿐만 아니라 프로퍼티를 재정의해 상속받은 저장 프로퍼티 또는 연산 프로퍼티에도 적용할 수 있습니다. 물론 상속받지 않은 연산 프로퍼티에는 프로퍼티 감시자를 사용할 필요가 없으며 할 수도 없습니다. 연산 프로퍼티의 접근자와 설정자를 통해 프로퍼티 감시자를 구현할 수 있기 때문입니다. 연산 프로퍼티는 상속받았을 때만 프로퍼티 재정의를 통해 프로퍼티 감시자를 사용합니다.
프로퍼티 감시자에는 프로퍼티의 값이 변경되기 직전에 호출하는 willSet 메소드와 프로퍼티의 값이 변경된 직후에 호출하는 didSet 메소드가 있습니다.
willSet 메소드와 didSet 메소드에는 매개변수가 하나씩 있습니다. willSet 메소드의 전달되는 전달인자는 프로퍼티가 변경될 값이고, didSet 메소드에 전달되는 전달인자는 프로퍼티가 변경되기 전의 값입니다. 그래서 매개변수의 이름을 따로 지정하지 않으면 willSet 메소드에는 newValue가, didSet 메소드에는 oldValue라는 매개변수 이름이 자동 지정됩니다.
newValue 혹은 oldValue 매개변수 이름 대신에 다른 이름을 사용하고 싶다면 willSet(newValueName)이나 didSet(oldValueName)처럼 willSet이나 didSet 다음에 소괄호로 감싼 이름을 적어주면 됩니다.
didSet 감시자 코드 불록 내부에서 oldValue 값을 참조하지 않거나 매개변수 목록에 명시적으로 매개변수를 적어 주지 않으면 didSet 코드 블록이 실행되지 않습니다.
class Account{
var credit: Int = 0{
willSet{
print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet{
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경되었습니다.")
}
}
}
let myAccount: Account = Account()
//잔액이 0원에서 1000원으로 변경될 예정입니다.
myAccount.credit = 1000
//잔액이 0원에서 1000원으로 변경되었습니다.
클래스를 상속받았다면 기존의 연산 프로퍼티를 재정의하여 프로퍼티 감시자를 구현할 수도 있습니다. 연산 프로퍼티를 재정의해도 기존의 연산 프로퍼티 기능(접근자와 설정자, get과 set 메소드)은 동작합니다.
class Account{
var credit: Int = 0{
willSet{
print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet{
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경되었습니다.")
}
}
var dollarValue: Double{
get{
return Double(credit)
}
set{
credit = Int(newValue*1000)
print("잔액을 \(newValue)달러로 변경 중입니다.")
}
}
}
class ForeignAccount: Account{
override var dollarValue: Double{
willSet{
print("잔액이 \(dollarValue)달러에서 \(newValue)달러로 변경될 예정입니다.)")
}
didSet{
print("잔액이 \(oldValue)달러에서 \(dollarValue)달러로 변경되었습니다.")
}
}
}
let myAccount: ForeignAccount = ForeignAccount()
myAccount.credit = 1000
myAccount.dollarValue = 2
'Programming > Swift' 카테고리의 다른 글
[Swift] 10.2 메서드 / 인스턴스 메서드 / 타입 메서드 (0) | 2021.07.20 |
---|---|
[Swift] 타입 프로퍼티 (0) | 2021.07.19 |
[Swift] 10.1.3 연산 프로퍼티 / 접근자와 설정자 (0) | 2021.07.16 |
[Swift] 10.1.2 지연 저장 프로퍼티 (0) | 2021.07.16 |
[Swift] 구조체와 클래스의 차이 / 식별연산자 (0) | 2021.07.15 |