속성감시자

쏘스야·2023년 4월 13일
0

ios 개발자의 첫걸음

목록 보기
48/61
/**
 속성 감시자(관찰자)
 - 저장속성을 감시 한다.
 - 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)
profile
개발자

0개의 댓글