AssociatedObjectOwnerの利用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class TestClass { }
extension TestClass: AssociatedObjectOwner {
private static var test1Key = 0 var test1: TestClass { get { getAssociatedObject(key: &TestClass.test1Key, initialObject: TestClass()) } set { setAssociatedObject(key: &TestClass.test1Key, object: newValue) } }
private static var test2Key = 0 var test2: String { get { getAssociatedObject(key: &TestClass.test2Key, initialObject: "" ) } set { setAssociatedObject(key: &TestClass.test2Key, object: newValue) } }
}
|
AssociatedObjectOwner定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| protocol AssociatedObjectOwner: AnyObject { func getAssociatedObject<T>(key: UnsafeRawPointer, initialObject: @autoclosure () -> T) -> T func setAssociatedObject<T>(key: UnsafeRawPointer, object: T?) }
extension AssociatedObjectOwner {
func getAssociatedObject<T>(key: UnsafeRawPointer, initialObject: @autoclosure () -> T) -> T { if let object = objc_getAssociatedObject(self, key) as? T { return object } let object = initialObject() objc_setAssociatedObject(self, key, object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) return object }
func setAssociatedObject<T>(key: UnsafeRawPointer, object: T?) { objc_setAssociatedObject(self, key, object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
}
|