class SooSan: NSObject {
@objc dynamic var shirimp: Int
init(shirimp: Int){
self.shirimp = shirimp
}
}
var hoonHoon = SooSan(shirimp: 100)
let kvo = hoonHoon.observe(\.shirimp, options: ([.old, .new])) { (object, change) in
print(change.oldValue, change.newValue)
}
hoonHoon.shirimp = 120
초기화 할 때와 값이 변경될 때 모두 핸들러가 호출됩니다.
var hoonHoon = SooSan(shirimp: 100) //초기화
let kvo = hoonHoon.observe(\.shirimp, options: ([.old, .new, .initial])) { (object, change) in
print(change.oldValue, change.newValue)
}
hoonHoon.shirimp = 120 //값 변경
//nil Optional(100)
//Optional(100) Optional(120)
초기화 할 때 핸들러가 호출되지 않았는데 두 번 호출이 됐습니다.
prior은 이전의 상태도 같이 줍니다.
값이 변경되기 위해 초기화 하는 순간 100은 oldValue가 됐고 newValue는 nil이 된 상태를 알려줍니다.
var hoonHoon = SooSan(shirimp: 100)
let kvo = hoonHoon.observe(\.shirimp, options: ([.old, .new, .prior])) { (object, change) in
print(change.oldValue, change.newValue)
}
hoonHoon.shirimp = 120
//Optional(100) nil
//Optional(100) Optional(120)
아래 처럼 object를 통해 shirimp의 값을 확인 하면 이전값과 현재 값이 같이 출력이 됩니다.
이것을 보면 change의 oldValue, newValue는 옵셔널이고 object에서 접근해서 가져오면 옵셔널이 아닌 값으로 가져오는 것을 알 수 있네요!
oldValue와 newValue는 위의 예제들 처럼 값을 가지지 않을 수 있어서 옵셔널로 정의 되어 있고, object는 각 프로퍼티에 따라서 정해지겠네요! 현재 shirimp는 Int값이어서 같은 Int 값으로 정의됩니다.
var hoonHoon = SooSan(shirimp: 100)
let kvo = hoonHoon.observe(\.shirimp, options: ([.old, .new, .prior])) { (object, change) in
print(object.shirimp)
}
hoonHoon.shirimp = 120
//100
//120
prior를 options에 넣어 주면 isPrior 프로퍼티를 사용하여 이전값인지 확인할 수 있습니다. 이전값이면 true 현재값이면 false가 반환됩니다.
var hoonHoon = SooSan(shirimp: 100)
let kvo = hoonHoon.observe(\.shirimp, options: ([.old, .new, .prior])) { (object, change) in
print(object.shirimp)
print(change.isPrior)
}
hoonHoon.shirimp = 120
//100
//true
//120
//false