Swiftのプロトコルとは?役割・使いどころ・存在意義やメリット。

〽️ 存在意義を知った上で理解しましょう。







プロトコル…うん。だから何?

こんにちは、「ふ」です。
SwiftUIのチュートリアルで新規ファイルを作成したときに記述されているコード、

import SwiftUI struct ContentView 「「1: View」」 { var body: some View { Text("Hello World") } }

struct ContentViewの準拠元のように書かれたこの「: View」の部分。これがプロトコルです。

「プロトコル」?何ですかそれは。
チュートリアルのはじめっからいきなりつまづいて、前に進めない・・

ところで。

コード学習において、見知らぬ文法などに遭遇したときにありがちなこと。

・使い方などはググればある程度飲み込める。

・しかしその存在意義が不明なので、しっくりこない。

このページにたどりついた方(ありがとう!)は、既にprotocolの記述方法や挙動については他のページを調べることによって、或る程度は理解されているのかもしれませんね。。
然し乍ら、「じゃあどんなメリットがあるの?」と疑問に思ったことだと思います。

「プロトコル」とは、よく「クラスなどの仕様書」と表現されているのを見かけますが、どういうことなのでしょう。
そこで今回は「プロトコル」の実装方法についてはさておき、その存在意義について考えてみたいと思います。





以下、Swiftの文法など一切無視してそのイメージを示してみます。「クラス」「プロトコル」以外のコード用語は登場しないので、安心して観てください。



通常。

例えばこんな状況を想定してみます。

例えば。

◼︎ 部分的に 「共通性」のあるクラス を複数個作りたい。

Aというクラスがある。

Aを元にしたクラスBを作る。

Bを元にしたクラスCを作る。
ここまでは成立してしまいます。そうすると、

クラスAとCの共通性はどこへやら、となってしまい、このやり方では共通性が保証されていません。



かといって。

クラスAを他全ての基準となるスーパークラスとし、それを元にクラスを派生させていくことで共通性を持たせる、という方法も考えられます。が。

他の様々なクラスに対応させるべくクラスAの内容はどんどんと肥大し、膨大なコード量となってしまいます。



プロトコル有り。

プロトコル有り。

クラスの中には「『猫』を絶対に実装しなさい。」というお触れ書き(プロトコル)の「P」を定義して、それに準拠したクラスを作っていきます。
先ほどのクラスA、B、Cがそれぞれ成立するのか、見ていきましょう。

クラスAはお触れ書き(プロトコル)に準拠していますね。

クラスBにも「猫」が実装されているので大丈夫です。

クラスCは「猫」がいないので成立しません。エラーとなってしまいます。

これを修正しましょう。

クラスCに「猫」を実装することで、プロトコルに準拠できました。これはエラーにならずに成立します。
お触れ書き「P」に従うことが強制されるので、結果的に3つのクラスには最低限の共通性が保証されることになります。

◼︎ 部分的に 「共通性」のあるクラス を複数個作りたい。

当初の目的が達成できましたね。



イメージできたでしょうか。

系統の似たクラスや構造体を何個か作りたいとき、最低限の「実装ルール」を決めているのがプロトコルという「仕様書」というわけです。
「プロトコル」を定義することで、メモリのばかデカいスーパークラスを作るはめになったり、クラス間で汚染し合って整合性を失うなどの問題を回避することができます。


「プロトコル」の役割。少しイメージして頂けたでしょうか。あとは、どんどんコードを書いて自分のものにしてくださいね ♫













「ふ」です。

swift、web、ガジェットなど。役立つ情報や観ていてたのしいページを書いていきたいと思います。

🐧 twitter 🐧