/**
속성 감시자(관찰자)
- 저장속성을 감시 한다.
- willSet() 메서드
*/
class Profile {
var name: String = "이름"
var statusMessage: String = "기본 상태메시지" {
willSet(message) {
print("메세지가 \(statusMessage)에서 \(message)로 변경될 예정입니다.")
// print("상태메세지 업데이트 준비")
}
}
}
let p = Profile()
//p.name
//p.name = "전지현"
//
//p.statusMessage
//p.statusMessage = "행복해"
//
//p.statusMessage = "우울해"
/*
기본적으로 "속성 감시자"라는 이름이지만, 성격은 메서드 -> 저장 속성 감시
- 저장 속성이 변하는 시점을 관찰
- 저장 속성이 변하는 순간 ===> 딸려있는 메서드가 호출됨
- willSet은 값이 저장되기 직전에 호출됨
*/
//p.statusMessage = "행복해"
// 속성 감시자는 새 값이 속성의 현재 값과 동일하더라도 속성 값이 설정 될 때마다 호출됨
/**
속성감시자의 2가지 종류 - willSet / didSet
*/
class Profile1 {
var name: String = "이름"
var statusMessage: String = "기본 상태메시지" {
willSet {// 새롭게 바뀔 파라미터
print("메세지가 \(statusMessage)에서 \(newValue)로 변경될 예정입니다.")
print("상태메세지 업데이트 준비")
}
didSet { // 값이 바뀌고 난 다음 파라미터, 실제사용할 때 didSet 을 많이 사용한다.
print("메세지가 \(oldValue)에서 \(statusMessage)로 이미 변경되었습니다.")
print("상태메세지 업데이트 완료")
}
}
var newName: String {
get {
return "안녕"
}
set {
print("값이 \(newValue) 로 변경 될 예정입니다.") // willSet 과 동일함.
self.name = newValue
}
}
init(message: String) {
self.statusMessage = message
}
}
let profile1 = Profile1(message: "기본 상태메세지")
profile1.newName = "조소야"
profile1.statusMessage = "기분이 좋앗쓰"
/**
주의점
- 저장 속성 (원래, 상속한 경우 둘다 가능)
- 계산 속성 (상속해서 재정의하는 경우에만 가능) (단순 메서드 추가)
- 계산 속성의 경우, 속성 관찰자를 만드는 대신 계산 속성의 set블록에서 값 변경을 관찰할 수 있기 때문에
(재정의 (상속)이 아닌 본래의 계산 속성에는 추가 불가)
- let (상수) 속성에는 당연히 추가 안됨 (값이 변하지 않으므로, 관찰할 필요가 없기 때문)
- 지연저장 속성에 안됨
*/
/*
실제 값의 변경이 일어나지 않아도, 값을 Set하는 작업을 하면 무조건 호출
*/
var x = 0
func willSetting(newValue: Int){
print(newValue)
}
func didSetting(oldValue: Int){
print(oldValue)
}
func setX(newX: Int) {
willSetting(newValue: newX)
x = newX
didSetting(oldValue: newX)
}
setX(newX: 5)