yynsmk's tech blog

何でもできる=何にもできない

【Swift】具体例でわかりやすいプロトコル解説

どうも。
今回は、Swiftで重要なプロトコルについて具体例を出しつつ解説していこうと思います。

プロトコルとは?

プロトコル(protocol)という言葉の辞書的な意味は「条約」とか「規約」です。
Swiftにおいては抽象化した約束事を表します。
言葉本来の意味に加えて抽象化という概念が入るのがポイントです。

現実問題で考えてみる

例として、選挙を考えます。
選挙では各立候補者は公約つまり、「日本を良くするための約束事」を 言います。
また、昨今問題となっている少子化問題を必ず解決しなければならないとします。

ここで、少子化問題の解決方法は各立候補が決めることです。
そのため、必須であっても具体的な内容まではあらかじめ決めておけませんよね。

つまり、必ず守って欲しい内容は抽象的な約束事として用意しておいて、細かい内容は約束事を守る側に決めさせるというのがSwiftにおけるプロトコルです。

プロトコルの使い方

上の例を踏まえてプロトコルの使い方をソースコードで見ていきましょう。

// プロトコルの宣言
protocol PublicCommitment {
    func stopDecliningBirthRates()
}

// プロトコルに準拠した麻生クラス
class Asou: PublicCommitment {
    func stopDecliningBirthRates() {
        print("子育ての補助金を増やします")
    }
}

// プロトコルに準拠した安倍クラス
class Abe: PublicCommitment {
    func stopDecliningBirthRates() {
        print("育メン制度を整えます")
    }
}

プロトコルは基本的にクラスと同じように定義・継承して使います。
クラスと違うのは主に次の2点です。

  • プロトコルのメソッドは空

  • プロトコルは多重継承が可能

プロトコルのメソッドが空なのは、上で説明したようにそのプロトコルに準拠した各クラスで具体的な処理内容を記述するためです。
逆に、プロトコルに準拠したのにメソッドを実装していないとエラーが発生します。

iOSアプリ開発におけるプロトコルの具体例

アプリの開発中に独自のプロトコルを作成することはあまりありません。
どこで使われているのかというと、Appleが用意してくれているライブラリです。

例えば、TableViewを使いたいときは UITableViewDelegate, UITableViewDataSourceという2つのプロトコルに準拠して、以下の2つのtableViewメソッドを実装する必要があります。
「TableView使うんだったらこの2つは絶対必要だから実装してね」ってことでプロトコルにしているのだと思います。

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }

    tableView.reloadData()

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        return cell
    }
}

まとめ

  • プロトコルはiOSアプリ開発における必須の技術

  • プロトコルとは抽象化した約束事

  • プロトコルを準拠したクラス内でメソッドの実装をする

Swiftのプロトコルは、C++やJavaでいうインタフェースなんですが、個人的にはインタフェースよりも、ある機能を使うために実装しておかないといけない約束事って感じの方がわかりやすく思います。

また、プロトコルを勉強するにあたっては以下の書籍が非常にためになりました!