Skip to content

Instantly share code, notes, and snippets.

@avdyushin
Forked from correia/swift-kvo-example.swift
Created June 21, 2016 14:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save avdyushin/c1e5dc2c37dea5915f572d6a66dfa38a to your computer and use it in GitHub Desktop.
Save avdyushin/c1e5dc2c37dea5915f572d6a66dfa38a to your computer and use it in GitHub Desktop.
A quick example for how to use Foundation style KVO from Swift. (Official documentation from Apple is forthcoming.)
//
// Swift-KVO
//
// Created by Jim Correia on 6/5/14.
// Copyright (c) 2014-2015 Jim Correia. All rights reserved.
//
// Update: 6/17/2014
//
// KVOContext has gone away; use the same idiom you'd use from Objective-C for the context
//
// Update 6/10/2015
//
// Updated for Swift 2
// Use dynamic on observable properties
import Foundation
typealias KVOContext = UInt8
var MyObservationContext = KVOContext()
class Observer: NSObject {
func startObservingPerson(person: Person) {
let options = NSKeyValueObservingOptions([.New, .Old])
person.addObserver(self, forKeyPath: "firstName", options: options, context: &MyObservationContext)
person.addObserver(self, forKeyPath: "lastName", options: options, context: &MyObservationContext)
}
func stopObservingPerson(person: Person) {
person.removeObserver(self, forKeyPath: "firstName", context: &MyObservationContext)
person.removeObserver(self, forKeyPath: "lastName", context: &MyObservationContext)
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [NSObject : AnyObject]?, context: UnsafeMutablePointer<Void>) {
guard keyPath != nil else {
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
return
}
switch (keyPath!, context) {
case("firstName", &MyObservationContext):
print("First name changed: \(change)")
case("lastName", &MyObservationContext):
print("Last name changed: \(change)")
case(_, &MyObservationContext):
assert(false, "unknown key path")
default:
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
}
}
}
class Person: NSObject {
dynamic var firstName: String?
dynamic var lastName: String?
}
let person = Person()
let observer = Observer()
observer.startObservingPerson(person)
person.firstName = "Jim"
person.lastName = "Correia"
observer.stopObservingPerson(person)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment