Skip to content

Instantly share code, notes, and snippets.

@simonseyer
Created February 27, 2018 15:37
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save simonseyer/cf73e733355501405982042f760d2a7d to your computer and use it in GitHub Desktop.
Save simonseyer/cf73e733355501405982042f760d2a7d to your computer and use it in GitHub Desktop.
Typesafe implementation of a weak set in Swift 4
import Foundation
public class WeakSet<T: AnyObject>: Sequence, ExpressibleByArrayLiteral, CustomStringConvertible, CustomDebugStringConvertible {
private var objects = NSHashTable<T>.weakObjects()
public init(_ objects: [T]) {
for object in objects {
insert(object)
}
}
public convenience required init(arrayLiteral elements: T...) {
self.init(elements)
}
public var allObjects: [T] {
return objects.allObjects
}
public var count: Int {
return objects.count
}
public func contains(_ object: T) -> Bool {
return objects.contains(object)
}
public func insert(_ object: T) {
objects.add(object)
}
public func remove(_ object: T) {
objects.remove(object)
}
public func makeIterator() -> AnyIterator<T> {
let iterator = objects.objectEnumerator()
return AnyIterator {
return iterator.nextObject() as? T
}
}
public var description: String {
return objects.description
}
public var debugDescription: String {
return objects.debugDescription
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment