objc_getAssociatedObjectを使ってUIViewに新しいプロパティーを生やしてみました。
UIViewにプロパティーを追加する
UIViewにvalueというプロパティーを生やします。
実装は簡単で、下のようなextensionを追加すれば完了です。
private var valueKey = 0 extension UIView { var value: Int? { get { return objc_getAssociatedObject(self, &valueKey) as? Int } set { objc_setAssociatedObject(self, &valueKey, newValue, .OBJC_ASSOCIATION_ASSIGN) } } }
実行すると、下のように値をセットする事ができます。
let view = UIView() print(view.value) // → nil view.value = 10 print(view.value) // → Optional(10)
もちろんインスタンスが違えばプロパティーも別です。
let view = UIView() let view2 = UIView() view.value = 10 print(view.value) // → Optional(10) print(view2.value) // → nil
キーとして宣言したvalueKeyですが、型はInt以外でも問題ありません。
private var valueKey = "valueKey" extension UIView { var value: Int? { get { return objc_getAssociatedObject(self, &valueKey) as? Int } set { objc_setAssociatedObject(self, &valueKey, newValue, .OBJC_ASSOCIATION_ASSIGN) } } }
valueKeyの値は他プロパティーと被っても問題ありません。
private var valueKey = "valueKey" private var valueKey2 = "valueKey" extension UIView { var value: Int? { get { return objc_getAssociatedObject(self, &valueKey) as? Int } set { objc_setAssociatedObject(self, &valueKey, newValue, .OBJC_ASSOCIATION_ASSIGN) } } var value2: Int? { get { return objc_getAssociatedObject(self, &valueKey2) as? Int } set { objc_setAssociatedObject(self, &valueKey2, newValue, .OBJC_ASSOCIATION_ASSIGN) } } } let view = UIView() print(view.value) // → nil print(view.value2) // → nil view.value = 10 print(view.value) // → Optional(10) print(view.value2) // → nil