はじめに
swiftの extension では通常格納型のProperty を追加できません。
しかし、 ObjectiveC の時代からある仕組みを使うと一応できるようになります。
方法
こんな感じに objc_getAssociatedObject
、 objc_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とかを作る際にピンポイントで使うととても便利かな、と思います。