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)
}

}