Skip to content

Instantly share code, notes, and snippets.

@codelynx
Last active September 26, 2018 01:20
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save codelynx/5e24a436ae3c4d91df33 to your computer and use it in GitHub Desktop.
Save codelynx/5e24a436ae3c4d91df33 to your computer and use it in GitHub Desktop.
Swifty NSMapTable that can deal with weak referenced object - subclassing edition
// ZMapTable.swift
//
// Copyright (c) 2016 Kaz Yoshikawa. Released under MIT License.
class ZMapTable<K: AnyObject, V: AnyObject>: CustomStringConvertible {
let mapTable: NSMapTable
private init(mapTable: NSMapTable) {
self.mapTable = mapTable
}
subscript(key: K) -> V? {
get { return self.mapTable.objectForKey(key) as? V }
set { self.mapTable.setObject(newValue, forKey: key) }
}
var description: String {
return mapTable.description
}
}
class ZStrongToWeakMapTable<K: AnyObject, V: AnyObject>: ZMapTable<K, V> {
init() {
super.init(mapTable: NSMapTable.strongToWeakObjectsMapTable())
}
}
class ZWeakToStrongMapTable<K: AnyObject, V: AnyObject>: ZMapTable<K, V> {
init() {
super.init(mapTable: NSMapTable.weakToStrongObjectsMapTable())
}
}
class ZWeakToWeakMapTable<K: AnyObject, V: AnyObject>: ZMapTable<K, V> {
init() {
super.init(mapTable: NSMapTable.weakToWeakObjectsMapTable())
}
}
class ZStrongToStrongMapTable<K: AnyObject, V: AnyObject>: ZMapTable<K, V> {
init() {
super.init(mapTable: NSMapTable.strongToStrongObjectsMapTable())
}
}
@codelynx
Copy link
Author

Sample (note: String is not AnyObject use NSString)

var mapTable = ZWeakToStrongMapTable<NSString, NSString>()
var alice: NSString? = "Alice"
var bob: NSString? = "Bob"
mapTable[alice!] = toronto
mapTable[bob!] = newyork
print(mapTable.description) // [Bob -> New York, Alice -> Toronto]

alice = nil
print(mapTable.description)  // Alice is till in the map table

dispatch_async(dispatch_get_main_queue()) {
    print(self.mapTable.description) // sometime later alice is gone
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment