| // RUN: %target-run-simple-swift | %FileCheck %s |
| // REQUIRES: executable_test |
| |
| // REQUIRES: objc_interop |
| |
| // rdar://problem/19060227 |
| |
| import Foundation |
| |
| class ObservedValue: NSObject { |
| @objc dynamic var amount = 0 |
| } |
| |
| class ValueObserver: NSObject { |
| private var observeContext = 0 |
| let observedValue: ObservedValue |
| |
| init(value: ObservedValue) { |
| observedValue = value |
| super.init() |
| observedValue.addObserver(self, forKeyPath: "amount", options: .new, context: &observeContext) |
| } |
| |
| deinit { |
| observedValue.removeObserver(self, forKeyPath: "amount") |
| } |
| |
| override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { |
| if context == &observeContext { |
| if let change_ = change { |
| if let amount = change_[.newKey] as? Int { |
| print("Observed value updated to \(amount)") |
| } |
| } |
| } |
| } |
| } |
| |
| let value = ObservedValue() |
| value.amount = 42 |
| let observer = ValueObserver(value: value) |
| // CHECK: updated to 43 |
| value.amount += 1 |
| // CHECK: amount: 43 |
| dump(value) |
| |
| |