しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

objc_getAssociatedObjectで既存オブジェクトにプロパティーを追加

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