Created
December 28, 2021 09:12
-
-
Save maximkrouk/c914c782515a5a77ed1c0e5a40ab1361 to your computer and use it in GitHub Desktop.
StaticString based object association
This file contains 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
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