たまにプラグインで必須じゃないメソッドがあるProtocol(インターフェイス)みたいなのをたまに見る。 実装というか準拠先にインターフェイス
※プロトコルの場合は「継承する(させる)」ではなく「準拠する(させる)」
どうやるのか調べた。
https://stackoverflow.com/questions/24032754/how-to-define-optional-methods-in-swift-protocol
protocol MyProtocol { func doSomething() } extension MyProtocol { func doSomething() { /* return a default value or just leave empty */ } } struct MyStruct: MyProtocol { /* no compile error */ }
extensionを用意すればいいのか!?
と思ったが、 delegate?.doSomething()
したとき準拠したクラスのメソッドで doSomething
が呼ばれない・・。
extension MyProtocol
のがそのまま呼ばれてる?
これがいい!
Raphael氏のを参考に警告がうざいので AnyObject
にした。
@objc
はプロトコル側にもいる
@objc protocol MyProtocol: AnyObject { func doSomething() @objc optional func doSomething() }
呼ぶ時は delegate?.doSomething?()
みたくメソッド自体がオプショナルなので ()
の前に ?
がいる模様。