Skip to content

Instantly share code, notes, and snippets.

@maximkrouk
Created December 28, 2021 09:12
Show Gist options
  • Save maximkrouk/c914c782515a5a77ed1c0e5a40ab1361 to your computer and use it in GitHub Desktop.
Save maximkrouk/c914c782515a5a77ed1c0e5a40ab1361 to your computer and use it in GitHub Desktop.
StaticString based object association
import Foundation
public protocol AssociatingObject: AnyObject {
@inlinable
@discardableResult
func setAssociatedObject<Object>(
_ object: Object,
forKey key: StaticString,
policy: objc_AssociationPolicy
) -> Bool
@inlinable
func getAssociatedObject<Object>(
of type: Object.Type,
forKey key: StaticString
) -> Object?
}
extension AssociatingObject {
@inlinable
@discardableResult
public func setAssociatedObject<Object>(
_ object: Object,
forKey key: StaticString,
policy: objc_AssociationPolicy = .OBJC_ASSOCIATION_RETAIN_NONATOMIC
) -> Bool {
key.withUTF8Buffer { pointer in
if let p = pointer.baseAddress.map(UnsafeRawPointer.init) {
objc_setAssociatedObject(self, p, object, policy)
return true
} else {
return false
}
}
}
@inlinable
public func getAssociatedObject<Object>(
of type: Object.Type = Object.self,
forKey key: StaticString
) -> Object? {
key.withUTF8Buffer { pointer in
if let p = pointer.baseAddress.map(UnsafeRawPointer.init) {
return objc_getAssociatedObject(self, p) as? Object
} else {
return nil
}
}
}
}
extension NSObject: AssociatingObject {}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment