[다양한 표현 및 확장] 8. 프로퍼티 감시자

Seoyoung Lee·2022년 2월 24일
0


2021년 11월 29일에 공부한 내용입니다.

1. 프로퍼티 감시자

  • 프로퍼티 감시자를 사용하면 프로퍼티의 값이 변경될 때 원하는 동작을 수행할 수 있다.
  • 값이 변경되기 직전에 willSet 블럭이, 값이 변경된 직후에 didSet 블럭이 호출된다.
  • 둘 중 필요한 하나만 구현해주어도 무관하다.
  • 변경되려는 값이 기존 값과 똑같더라도 프로퍼티 감시자는 항상 동작한다.
  • willSet 블럭에서는 암시적 매개변수 newValue를, didSet 블럭에서는 oldValue를 사용할 수 있다.
  • 프로퍼티 감시자는 연산 프로퍼티에는 사용할 수 없다.
  • 프로퍼티 감시자는 함수, 메서드, 클로저, 타입 등의 지역/전역 변수에 모두 사용할 수 있다.

2. 정의 및 사용

struct Money {
    // 프로퍼티 감시자 사용
    // currencyRate라는 프로퍼티의 값이 변경될 때 willSet 또는 didSet이 실행된다.
    var currencyRate: Double = 1100 { // currencyRate - 저장 프로퍼티
        willSet(newRate) { // 앞으로 바뀔 거다 (바뀌기 직전)
            print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다")
        }
        didSet(oldRate) { // 바뀌었다
            print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다")
        }
    }

    // 프로퍼티 감시자 사용
    var dollar: Double = 0 {
        // 매개변수를 지정해주지 않음 -> 암시적 매개변수
        // willSet의 암시적 매개변수 이름 newValue
        willSet {
            print("\(dollar)달러에서 \(newValue)달러로 변경될 예정입니다")
        }
        // didSet의 암시적 매개변수 이름 oldValue
        didSet {
            print("\(oldValue)달러세어 \(dollar)달러로 변경되었습니다")
        }
    }

    // 연산 프로퍼티
    var won: Double {
        get {
            return dollar * currencyRate
        }
        set {
            dollar = newValue / currencyRate
        }

        /* 프로퍼티 감시자와 연산 프로퍼티 기능을 동시에 사용할 수 없다
        // 프로퍼티 감시자는 저장된 값이 변경될 때 호출되기 때문
        willSet {

        }
        */
    }
}

// 사용
var moneyInMyPocket: Money = Money()

// 환율이 1100.0에서 1150.0으로 변경될 예정입니다
moneyInMyPocket.currencyRate = 1150
// 환율이 1100.0에서 1150.0으로 변경되었습니다

// 0.0달러에서 10.0달러로 변경될 예정입니다
moneyInMyPocket.dollar = 10
// 0.0달러에서 10.0달러로 변경되었습니다

print(moneyInMyPocket.won)
// 11500.0

// 지역/전역 변수에서 모두 사용 가능
var a: Int = 100 {
    willSet {
        print("\(a)에서 \(newValue)로 변경될 예정입니다")
    }
    didSet {
        print("\(oldValue)에서 \(a)로 변경되었습니다")
    }
}

// 100에서 200로 변경될 예정입니다
a = 200
// 100에서 200로 변경되었습니다
profile
나의 내일은 파래 🐳

0개의 댓글