Skip to content

Instantly share code, notes, and snippets.

@paulweichhart
Last active March 24, 2018 09:42
Show Gist options
  • Save paulweichhart/c4f7819febcecf11c0fd88612922d1ba to your computer and use it in GitHub Desktop.
Save paulweichhart/c4f7819febcecf11c0fd88612922d1ba to your computer and use it in GitHub Desktop.
ClosureSet
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
final class ClosureSet<T> {
private var closure: ((T) -> Void)?
init () { }
func set(_ closure: @escaping (T) -> Void) {
self.closure = closure
}
func notify(_ value: T? = nil) {
guard let closure = closure else {
return
}
switch value {
case .some(let value): closure(value)
case .none: closure(() as! T)
}
}
}
final class Controller {
private var viewModel: ViewModel
init(viewModel: ViewModel) {
self.viewModel = viewModel
}
}
final class ViewModel {
private var interactor: InteractorProtocol
init(interactor: InteractorProtocol) {
self.interactor = interactor
interactor.didFire.set { [weak self] in
print("didFire")
}
interactor.valueChanged.set { [weak self] value in
print("value Changed \(value)")
}
}
}
protocol InteractorProtocol {
var didFire: ClosureSet<Void> { get }
var valueChanged: ClosureSet<Int> { get }
}
final class Interactor: InteractorProtocol {
let didFire = ClosureSet<Void>()
let valueChanged = ClosureSet<Int>()
private var counter = 0
init() {
setupTimer()
}
func setupTimer() {
Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fireaway), userInfo: nil, repeats: true)
}
@objc func fireaway() {
counter += 1
didFire.notify()
valueChanged.notify(counter)
}
}
var interactor = Interactor()
let viewModel = ViewModel(interactor: interactor)
let controller = Controller(viewModel: viewModel)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment