プログラミング

【Swift】ExtensionとProtocolで処理を共通化する方法

swift-eyecatch

例えば、Custome1ViewControllerとCustome2ViewControllerというものがあるとします。そして、この2つのViewControllerは両方とも、ユーザーの詳細情報画面に遷移する、”moveToUserProfile(user: User)”という処理を持っているとします。

これをそれぞれのViewControllerで記述すると、同じ処理を繰り返し書いていることになり、あまり効率がよくありません。また変更が必要になった時に、片方を修正し忘れることになるなど、メンテナンスの観点でも良くはありません。

このように、共通の処理を記述する時は1箇所に纏めてどちらからでも呼び出せるようにしておくほうが良いです。

この記事では、処理を共通化する書き方を以下の2種類書いています。

  • UIViewControllerのExtensionとして処理を共通化する
  • Protocolを定義し、Protcolを継承する形で処理を共通化する

UIViewControllerのExtensionとして処理を共通化する

こちらは理解が簡単というか、単純な方法です。

UIViewController+Extension.swiftなどのファイルに以下を記述しておきます。

extension UIViewController {
    func moveToUserProfile(_ user: User) {
        //処理
    }
}

こうすることで、どのUIVewControllerからもこの関数を呼べるようになります。変更がある際は、この関数を変更するだけでOKです。

ただこの場合は、どのUIViewControllerからもこの処理が呼べるようになってしまいます。

より厳密に特定のViewControllerにのみ処理を許容したい場合は、Protocolを記述して、そのProtocolを特定のViewControllerにのみ適応させるほうが良いです。

Protocolを定義して処理を共通化する

Protocolとして処理を共通化するには、以下のように記述します。

protocol UserProfileMovable {}
extension UserProfileMovable where Self: UIViewController  {
    func moveToUserProfile(_ user: User) {
        //処理
    }
}

そして、このProtocolを適応させたいViewContollerには以下のように記載します。

class Custom1ViewController: UIViewController, UserProfileMovable {}

これで、Custom1ViewControllerでもmoveToUserProfile(_ user:User)の関数を使用出来るようになります。