diff --git a/SOPTving/SOPTving/Utility/DesignPattern/Observable.swift b/SOPTving/SOPTving/Utility/DesignPattern/Observable.swift new file mode 100644 index 0000000..3df3c52 --- /dev/null +++ b/SOPTving/SOPTving/Utility/DesignPattern/Observable.swift @@ -0,0 +1,42 @@ +// +// Observable.swift +// SOPTving +// +// Created by 장석우 on 2023/04/28. +// + +import Foundation + +final class Observable { + + struct Observer { + weak var observer: AnyObject? + let block: (T) -> Void + } + + private var observers = [Observer]() + + var value: T { + didSet { notifyObservers() } + } + + init(_ value: T) { + self.value = value + } + + func observe(on observer: AnyObject, observerBlock: @escaping (T) -> Void) { + observers.append(Observer(observer: observer, block: observerBlock)) + observerBlock(self.value) + } + + func remove(observer: AnyObject) { + observers = observers.filter { $0.observer !== observer } + } + + private func notifyObservers() { + for observer in observers { + observer.block(self.value) + } + } +} +