Created
November 8, 2018 16:02
-
-
Save ndizazzo/1692c002d9532fc00b9c3606458bb057 to your computer and use it in GitHub Desktop.
Swift Multicast Delegate
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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