Skip to content

Instantly share code, notes, and snippets.

@robinhayward
Last active October 29, 2015 17:26
Show Gist options
  • Save robinhayward/73fe4cc48dd4af7089d1 to your computer and use it in GitHub Desktop.
Save robinhayward/73fe4cc48dd4af7089d1 to your computer and use it in GitHub Desktop.
Playing around with generics
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let observer = NumberGeneratorObserver()
observer.generatedNumber = { (number) in
print("Observed: \(number)")
}
let generator = NumberGenerator()
generator.addObserver(observer)
generator.generate()
generator.removeObserver(observer)
generator.generate()
}
}
// MARK: - Number Generator (Observable Example)
class NumberGenerator {
private var observable = Observerable<NumberGeneratorObserver>()
func generate() {
notifyObserversOfNewNumber(7)
}
func addObserver(observer: NumberGeneratorObserver) {
observable.add(observer)
}
func removeObserver(observer: NumberGeneratorObserver) {
observable.remove(observer)
}
private func notifyObserversOfNewNumber(number: Int) {
for observer in observable.observers {
observer.generatedNumber?(number)
}
}
}
class NumberGeneratorObserver: Observer {
var generatedNumber: ((Int) -> ())?
func isEqualTo(other: Observer) -> Bool {
return ObjectIdentifier(self) == ObjectIdentifier(other)
}
}
// MARK: - Generic Observer
protocol Observer: class {
func isEqualTo(other: Observer) -> Bool
}
class Observerable<T: Observer> {
var observers = [T]()
func add(observer: T) {
observers.append(observer)
}
func remove(observerToRemove: T) {
if let index = findIndex(observers, observerToRemove) {
observers.removeAtIndex(index)
}
}
private func findIndex<T: Observer>(array: [T], _ valueToFind: T) -> Int? {
for (index, value) in array.enumerate() {
if value.isEqualTo(valueToFind) {
return index
}
}
return nil
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment