【Swift】Obj-Cではデリゲートメソッドが実装されているか確認するのに、Swiftではデリゲートメソッド実装確認をあまり見ない件について調べた。
はじめに
文末にある引用先のコードを引用しております。
もしよかったら必ずアクセスしてください。
表題の意味について
Objective-Cでは以下のように実装を省略できるデリゲートメソッドの書き方が存在します。その際に、デリゲートメソッドが実装されていないメソッドを呼び出してしまう可能性が生じてしまいます。
その際にプロトコルのデリゲートメソッドの実装の有無を確認し、実装されていた場合のみ、処理をするという記述を行います。
しかしながら、Swiftでそういったセオリーを聞いた事など無いので、実際どうなっているのかと感じ、調べました。
Objective-Cでのデリゲートメソッド
Swiftでのデリゲートメソッド
Swiftでは実装省略可能なデリゲートメソッドを実装できませんと調べた結果分かりました。なので、そもそも省略可能なデリゲートメソッドが実装されていないです。
つまり、呼び出せるのであれば必ず実装されているというので、実装の有無を確認する必要がないということでした。
表題に対する答えはこの為であると思います。
Swiftで実装を省略できるデリゲートメソッドの書き方のメリット・デメリット
しかしながら、プロトコルを定義する際に @objc 修飾子を付ければ、デリゲートメソッドを省略可能になっております。
これで万事解決かと思いましたが、@objc修飾子をつけることによるデメリットも存在します。
言い換えると、@objc 修飾子つけると Objective-C のプログラムで利用できない構成要素を含むことはできないということになります。
例えば、@objc 修飾子をつけて定義されたプロトコルは、クラスのみでしか採用できず構造体や列挙型では利用できません。また、 Generics も利用できません。
既存で実装しているクラスなどで構造体・列挙型などSwiftで利用される値型が利用できないということです。
@objc修飾子を実装する事で出来ない処理が存在する可能性があります。
行うべきベストプラクティス
プロトコル拡張を行って、必ずしも実装する必要のない処理は拡張メソッドに含めてしまえば良さそうです。