카테고리 없음

Swift) didset willset 옵저버

나태한개발 2024. 6. 29. 16:59

프로퍼티 옵저버란?

프로퍼티 옵저버는 프로퍼티의 값이 변경될 때 추가적인 작업을 수행할 수 있도록 해준다. Swift에서는 didSet과 willSet 두 가지 옵저버를 제공한다.

 

  • willSet: 프로퍼티의 값이 변경되기 직전에 호출된다. 새로운 값이 파라미터로 제공된다.
  • didSet: 프로퍼티의 값이 변경된 직후에 호출된다. 이전 값이 파라미터로 제공된다.

willSet

var temperature: Double = 0.0 {
    willSet(newTemperature) {
        print("온도가 \(temperature)에서 \(newTemperature)로 변경될 예정입니다.")
    }
}

위 예제에서 temperature 프로퍼티에 willSet 옵저버를 추가했다. 프로퍼티의 값이 변경되기 직전에 "온도가 이전 값에서 새 값으로 변경될 예정입니다."라는 메시지가 출력된다.

 

 

didSet

var counter: Int = 0 {
    didSet {
        if counter > oldValue {
            print("카운터가 증가했습니다. 이전 값: \(oldValue), 현재 값: \(counter)")
        } else {
            print("카운터가 감소했습니다. 이전 값: \(oldValue), 현재 값: \(counter)")
        }
    }
}

 

위 예제에서 counter 프로퍼티에 didSet 옵저버를 추가했다. 프로퍼티의 값이 변경된 직후에 "카운터가 증가했습니다." 또는 "카운터가 감소했습니다."라는 메시지가 출력된다. oldValue는 변경 전의 값이다.

 

프로퍼티 옵저버의 활용

프로퍼티 옵저버는 값의 변경을 감지하고 이에 따라 UI 업데이트, 데이터 저장, 로깅 등의 추가적인 작업을 수행하는 데 유용하게 사용된다. 특히 UI와 데이터 상태를 동기화할 때 매우 유용하다.

class User {
    var username: String {
        didSet {
            print("사용자 이름이 변경되었습니다: \(username)")
            updateUI()
        }
    }
    
    init(username: String) {
        self.username = username
    }
    
    func updateUI() {
        // UI 업데이트 로직
    }
}

let user = User(username: "Alice")
user.username = "Bob" // "사용자 이름이 변경되었습니다: Bob" 출력 및 updateUI() 호출

위 예제에서는 사용자 객체를 생성하고, username 프로퍼티에 didSet 옵저버를 추가하여 사용자 이름이 변경될 때마다 UI 업데이트를 수행하도록 한다.