iOS 앱 개발에서, Observer는 유저의 특정한 이벤트에 대한 알림을 해주는 Object이다. Property Observer는 Property의 값의 변화에 따라 관측하고 응답한다. Property의 값이 지정되거나, 심지어는 전/후 값이 동일하더라도 값의 변경의 조짐이 보일때마다 항상 불려진다. Property Observer는 두 방식의 Observer를 제공한다!
willSet
: willSet은 값이 저장되기 직전에 호출된다. willSet에서는 newValue
라는 특정한 constant parameter를 가진다.oldValue
라는 특정한 constant parameter를 가진다.주목할 점은, parameter name인 newValue와 oldValue는 override가 가능하다고 한다. 근데 굳이..??
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
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
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)")
}
}
}