Skip to content

Instantly share code, notes, and snippets.

@beccadax
Created September 30, 2016 05:45
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 beccadax/75bfd619379fea53d8ca8afaa16d95bb to your computer and use it in GitHub Desktop.
Save beccadax/75bfd619379fea53d8ca8afaa16d95bb to your computer and use it in GitHub Desktop.
final class AssociatedValue<Value, Object: NSObject> {
init(_ memoryManagement: AssociatedValueMemoryManagement, ofType valueType: Value.Type, on objectType: Object.Type) {
self.memoryManagement = memoryManagement
}
let memoryManagement: AssociatedValueMemoryManagement
var key: UnsafeRawPointer {
return UnsafeRawPointer(Unmanaged.passUnretained(self).toOpaque())
}
subscript (object: Object) -> Value? {
get {
return objc_getAssociatedObject(object, key) as! Value?
}
set {
objc_setAssociatedObject(object, key, newValue, memoryManagement.objcPolicy)
}
}
}
struct AssociatedValueMemoryManagement: OptionSet {
var rawValue: Int = 0
static var unsafeUnowned = AssociatedValueMemoryManagement(rawValue: 0)
static var strong = AssociatedValueMemoryManagement(rawValue: 1)
static var copied = AssociatedValueMemoryManagement(rawValue: 3)
static var atomic = AssociatedValueMemoryManagement(rawValue: 8)
init(rawValue: Int) {
self.rawValue = rawValue
}
fileprivate var objcPolicy: objc_AssociationPolicy {
switch self {
case [.unsafeUnowned]:
return .OBJC_ASSOCIATION_ASSIGN
case [.strong]:
return .OBJC_ASSOCIATION_RETAIN_NONATOMIC
case [.copied]:
return .OBJC_ASSOCIATION_COPY_NONATOMIC
case [.strong, .atomic]:
return .OBJC_ASSOCIATION_RETAIN
case [.copied, .atomic]:
return .OBJC_ASSOCIATION_COPY
default:
fatalError("Invalid AssociatedValueMemoryManagement")
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment