[iOS] Property Observer - didSet, willSet 형제

라보·2024년 1월 15일
0
post-thumbnail
post-custom-banner

참고

iOS 앱 개발에서, Observer는 유저의 특정한 이벤트에 대한 알림을 해주는 Object이다. Property Observer는 Property의 값의 변화에 따라 관측하고 응답한다. Property의 값이 지정되거나, 심지어는 전/후 값이 동일하더라도 값의 변경의 조짐이 보일때마다 항상 불려진다. Property Observer는 두 방식의 Observer를 제공한다!

  • willSet : willSet은 값이 저장되기 직전에 호출된다. willSet에서는 newValue라는 특정한 constant parameter를 가진다.
  • didSet : didSet은 새로운 값으로 저장되는 즉시 호출된다. didSet에서는 oldValue라는 특정한 constant parameter를 가진다.

    주목할 점은, parameter name인 newValue와 oldValue는 override가 가능하다고 한다. 근데 굳이..??

1. Stored properties that you define

struct Employee {
    var name: String
    var age: Int {
        willSet(newValue) {
            print("\(name) age is set to \(newValue)")
        }
        didSet {
            print("\(name) age changed from \(oldValue) to \(age)")
        }
    }
}

var emp = Employee(name: "Tom", age: 20)
emp.age = 30

// Tom age is set to 30
// Tom age changed from 20 to 30

2. Stored properties that you inherit

class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
}

class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}

class AutomaticCar: Car {
    override var currentSpeed: Double { // inherit Stored property
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")

// AutomaticCar: traveling at 35.0 miles per hour in gear 4

3. Computed properties that you inherit

class Shape {
    var width = 0.0
    var height = 0.0
    
    var area: Double {
        get {
            return width * height
        }
        set {
            self.width = sqrt(newValue)
            self.height = sqrt(newValue)
        }
    }
}

class Rectangle: Shape {
    override var area: Double {
        didSet {
            print("Old value is \(oldValue)")
        }
        willSet {
            print("New value is \(newValue)")
        }
    }
}
profile
RTFM
post-custom-banner

0개의 댓글