[Programming Language]/[Swift]

[Swift] 프로퍼티 관찰자(Property Observers)

Semincolon 2024. 11. 6. 08:41

1. 프로퍼티 관찰자

프로퍼티 관찰자프로퍼티의 값이 변경될 때 호출되는 것으로, 새로운 값이 기존 값과 동일하더라도 호출된다.

 

프로퍼티 관찰자에는 2가지 종류가 있다.

  • willSet : 새로운 값으로 변경되기 전에 호출
  • didSet : 새로운 값으로 변경되고 나서 호출

1-1. willSet

class Asset {
    var totalMoney: Int = 0 {
        willSet(newTotalMoney) {
            print("새로운 잔액 : \(newTotalMoney)만원")
        }
    }
}

let asset = Asset()
asset.totalMoney = 100 // 새로운 잔액 : 100만원

위 예제에서 willSetasset.totalMoney = 100 부분에서 값의 변경이 이뤄지기 전에 호출된다. 이때 변경될 새로운 값newTotalMoney라는 파라미터로 받고 있는데 이를 설정하지 않으면 newValue로 사용할 수 있다.

willSet {
	print("새로운 잔액 : \(newValue)만원")
}

 

1-2. didSet

class Asset {
    var totalMoney: Int = 0 {
        willSet {
            print("새로운 잔액 : \(newValue)만원")
        }
        
        didSet(oldTotalMoney) {
            if totalMoney >= oldTotalMoney {
                print("수익 : \(totalMoney - oldTotalMoney)만원")
            } else {
                print("손해 : \(oldTotalMoney - totalMoney)만원")
            }
        }
    }
}

let asset = Asset()

asset.totalMoney = 100 // 새로운 잔액 : 100만원, 수익 : 100만원
print()

asset.totalMoney = 50 // 새로운 잔액 : 50만원, 손해 : 50만원

앞선 예제에 didSet 관찰자가 추가되었다. 이는 값의 변경이 이뤄지고 나서 호출되고 변경되기 전의 값oldTotalMoney라는 파라미터로 받고 있다. willSet과 마찬가지로 별도의 이름을 정하지 않으면 oldValue로 사용할 수 있다.

didSet {
    if totalMoney >= oldValue {
        print("수익 : \(totalMoney - oldValue)만원")
    } else {
        print("손해 : \(oldValue - totalMoney)만원")
    }
}

 

 

2. 상속한 하위 클래스에서의 프로퍼티 관찰자 재정의

상위 클래스를 상속한 하위 클래스에서 상위 클래스의 프로퍼티에 대한 프로퍼티 관찰자를 정의할 수 있다. 이는 상위 클래스의 프로퍼티가 저장된 프로퍼티인지, 계산된 프로퍼티인지에 관계없이 가능하다.

class Vehicle {
    var maxSpeed: Int = 100
}

class Car: Vehicle {
    override var maxSpeed: Int {
        willSet {
            print("새로운 속도 : \(newValue)")
        }
        
        didSet {
            print("속도 변화 : \(maxSpeed - oldValue)")
        }
    }
}

let c = Car()

c.maxSpeed = 200

// 새로운 속도 : 200
// 속도 변화 : 100

 

그러나 만약 상위 클래스의 프로퍼티가 변수가 아닌 상수(Constant)라면 값이 변경될 일이 없으므로 프로퍼티 관찰자를 재정의할 수 없다.

 


끝!