프로퍼티 감시자

JG Ahn·2024년 10월 17일
0

swift 기초

목록 보기
18/23

1. 프로퍼티 감시자

  • 프로퍼티 값 변경시 원하는 동작 수행 가능
  • 연산 프로퍼티에서 사용 불가
  • 변경되려는 값이 기존 값과 동일해도 프로퍼티 감시자는 항상 동작
  • 함수, 메소드, 클로저, 타입 등의 지역/전역 변수에 모두 사용 가능
  • willSet/didSet - 둘 중 하나만 구현해도 됨
    • willSet : 값 변경 직전 호출됨. 암시적 매개변수 "newValue" 사용
      • newValue를 다른 이름으로 변경해서 사용 가능
    • didSet : 값 변경 직후 호출됨. 암시적 매개변수 "oldValue" 사용
      • oldValue를 다른 이름으로 변경해서 사용 가능

2. 정의 및 사용

struct Money {

    //프로퍼티 감시자 사용
    var currencyRate: Double = 1100 {
        willSet(newRate) { //newValue -> newRate로 이름 변경
            print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다")
        }

        didSet(oldRate) { //oldValue -> oldRate로 이름 변경
            print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다")
        }
    }
    
    //프로퍼티 감시자 사용
    var dollar: Double = 0 {
        willSet {
            print("\(dollar)달러에서 \(newValue)달러로 변경될 예정입니다")   
        }

        didSet {
            print("\(dollar)달러에서 \(oldValue)달러로 변경되었습니다")   
        }
    }

    var won: Double {
        get {
            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
//값 변경 직후 결과 : 10.0달러에서 0.0달러로 변경되었습니다

print(moneyInMyPocket.won) //결과 : 11500

0개의 댓글