속성 감시자(Property Observer)

황석범·2024년 12월 26일
0

내일배움캠프_iOS_5기

목록 보기
52/76

속성 감시자(Property Observer)

속성 감시자(Property Observers)는 Swift에서 특정 속성의 값이 변경되기 직전 또는 변경된 직후에 실행할 코드를 정의할 수 있는 기능입니다. 이를 통해 속성의 상태 변화를 감지하고, 추가 작업을 수행하거나, 부수효과(side effects)를 관리할 수 있습니다.

willSet & didSet

  • Swift에서는 willSetdidSet 두 가지 속성 감시자를 제공합니다
    • willSet: 값이 변경되기 직전에 호출됨.
    • didSet: 값이 변경된 직후에 호출됨.
  • 속성 감시자는 저장 속성(stored property) 또는 상위 클래스에서 상속받은 속성에 사용할 수 있습니다.

예제

var count: Int = 0 {
    willSet {
        print("count가 \(count)에서 \(newValue)로 변경될 예정입니다.")
    }
    didSet {
        print("count가 \(oldValue)에서 \(count)로 변경되었습니다.")
    }
}

count = 10
// 출력:
// count가 0에서 10로 변경될 예정입니다.
// count가 0에서 10로 변경되었습니다.

활용 사례

1. UI 업데이트

  • 속성 값이 변경될 때 UI를 자동으로 업데이트할 수 있습니다.
    // UI 업데이트 메서드
    private func updateUI() {
        countLabel.text = "\(count)"
    }
    
    // 버튼 액션
    @objc private func incrementCount() {
        count += 1
        updateUI() // 값 변경 후 수동으로 UI 업데이트
    }

이런 코드를 아래처럼 활용 가능

var count: Int = 0 {
    didSet {
        countLabel.text = "\(count)"
    }
}

2. 값 검증

  • didSet을 사용하여 속성 값이 특정 조건을 충족하지 않으면 값을 원래대로 복원할 수 있습니다.
var temperature: Int = 20 {
    didSet {
        if temperature < 0 || temperature > 100 {
            print("온도가 유효하지 않습니다. 값을 복원합니다.")
            temperature = oldValue
        }
    }
}

3. 디버깅

  • 속성 값이 변경될 때마다 로그를 남겨 디버깅에 사용할 수 있습니다.
var username: String = "" {
    willSet {
        print("username이 '\(username)'에서 '\(newValue)'로 변경될 예정입니다.")
    }
    didSet {
        print("username이 '\(oldValue)'에서 '\(username)'로 변경되었습니다.")
    }
}

주의 사항

  1. 초기화 시에는 호출되지 않음: 속성 감시자는 초기화(init) 중에는 호출되지 않습니다. 속성 감시자는 초기값이 설정된 이후에만 동작합니다.
var count: Int = 0 {
    didSet {
        print("count 변경됨")
    }
}

let counter = Counter() // 초기화 시 호출되지 않음
  1. 계산 속성에는 사용 불가: 속성 감시자는 저장 속성에만 사용할 수 있으며, 계산 속성(computed property)에는 사용할 수 없습니다. 계산 속성의 경우, get 및 set으로 대체해야 합니다.
var computedProperty: Int {
    get {
        // 값 반환
    }
    set {
        // 값 설정
    }
}
  1. 불필요한 반복 호출 방지: didSet에서 속성의 값을 변경하면, 무한 루프가 발생할 수 있으므로 주의해야 합니다.
var count: Int = 0 {
    didSet {
        count += 1 // 위험: 무한 루프 발생 가능
    }
}
profile
iOS 공부중...

0개의 댓글

관련 채용 정보