Skip to content

Instantly share code, notes, and snippets.

@ndizazzo
Created November 8, 2018 16:02
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 ndizazzo/1692c002d9532fc00b9c3606458bb057 to your computer and use it in GitHub Desktop.
Save ndizazzo/1692c002d9532fc00b9c3606458bb057 to your computer and use it in GitHub Desktop.
Swift Multicast Delegate
// Original obtained from: https://stackoverflow.com/a/44697868
// Modified to avoid force casts + use Swift 4.2 features
internal final class MulticastDelegate <T> {
private let delegates: NSHashTable<AnyObject> = NSHashTable.weakObjects()
func add(delegate: T) {
delegates.add(delegate as AnyObject)
}
func remove(delegate: T) {
for oneDelegate in delegates.allObjects.reversed() where oneDelegate === delegate as AnyObject {
delegates.remove(oneDelegate)
}
}
func invoke(invocation: (T) -> Void) {
for delegate in delegates.allObjects.reversed() {
guard let delegate = delegate as? T else { continue }
invocation(delegate)
}
}
}
func += <T: AnyObject> (left: MulticastDelegate<T>, right: T) {
left.add(delegate: right)
}
func -= <T: AnyObject> (left: MulticastDelegate<T>, right: T) {
left.remove(delegate: right)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment