Skip to content

Instantly share code, notes, and snippets.

@joshuawright11
Created September 1, 2017 22:30
Show Gist options
  • Select an option

  • Save joshuawright11/e4dfd49ffe54b68bb7999a0bd5f50638 to your computer and use it in GitHub Desktop.

Select an option

Save joshuawright11/e4dfd49ffe54b68bb7999a0bd5f50638 to your computer and use it in GitHub Desktop.
//
// Observable.swift
// Created by Josh Wright on 9/1/17.
//
import UIKit
class Observable<T>: NSObject {
public typealias ValueChanged = (T) -> Void
public var value: T {
didSet {
for obs in _observations {
obs.response(value)
}
}
}
private var _observations: [Observation] = []
init(value: T) {
self.value = value
super.init()
}
public func observe(_ valueChanged: @escaping ValueChanged) -> Observation {
return Observation(observable: self, response: valueChanged)
}
fileprivate func remove(observation: Observation) {
if let index = _observations.index(of: observation) {
_observations.remove(at: index)
}
}
class Observation: NSObject {
weak var observable: Observable<T>?
var response: Observable.ValueChanged
init(observable: Observable<T>, response: @escaping Observable.ValueChanged) {
self.observable = observable
self.response = response
super.init()
}
func cancel() {
observable?.remove(observation: self)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment