Skip to content

Instantly share code, notes, and snippets.

@jboullianne
Last active May 11, 2019 20:53
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 jboullianne/598c5603b0ff771ad1ed8b19d6f7d851 to your computer and use it in GitHub Desktop.
Save jboullianne/598c5603b0ff771ad1ed8b19d6f7d851 to your computer and use it in GitHub Desktop.
Observer Design Pattern in Swift
// Observer pattern in Swift
// Author: Jean-Marc Boullianne
class Subject<T> {
var val:T {
didSet {
notifyObservers()
}
}
var observers:[Observer<T>]
init(val: T) {
self.val = val
self.observers = []
}
func attach(observer: Observer<T>) {
observers.append(observer)
}
func notifyObservers() {
for observer in observers {
observer.callback(self.val)
}
}
}
class Observer<T> {
var callback:((T)->())
init(callback: @escaping (T) -> ()) {
self.callback = callback
}
}
var x = Subject<Int>(val: 0)
var observer1 = Observer<Int>(callback: { (val) in
print("Observer 1:", val)
})
var observer2 = Observer<Int>(callback: { (val) in
print("Observer 2:", val)
})
x.attach(observer: observer1)
x.attach(observer: observer2)
x.val = 10 // Will trigger calls to both callbacks above !
// --------------------------------------------
// 'Observer 1: 10'
// 'Observer 2: 10'
x.val = 22 // --------------------------------------------
// 'Observer 1: 22'
// 'Observer 2: 22'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment