LoginSignup
17
18

More than 5 years have passed since last update.

swift: extension を使って既存Classに格納型Propertyを追加する方法

Posted at

はじめに

swiftの extension では通常格納型のProperty を追加できません。
しかし、 ObjectiveC の時代からある仕組みを使うと一応できるようになります。

方法

こんな感じに objc_getAssociatedObjectobjc_setAssociatedObject を使います。
少し気をつける必要があるのが、 transitionAgentKey のようにget/setで同一のポインタアドレスを渡すようにすることです。(String Literalだと上手く行きませんでした)。

private var transitionAgentKey: UInt8 = 0

extension UIViewController : TransitionViewControllerProtocol {
    public var transitionAgent: TransitionAgentProtocol? {
        get {
            return objc_getAssociatedObject(self, &transitionAgentKey) as? TransitionAgentProtocol
        }
        set {
            objc_setAssociatedObject(self, &transitionAgentKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }
}    

さいごに

こういうのは多用すると危ない感じですが、Frameworkとかを作る際にピンポイントで使うととても便利かな、と思います。

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18