【iOS入門】プロトコル(protocol)って何?

アイキャッチ_iPhoneiOSアプリ開発

現在、書籍でiOS開発の学習を進めています。

プロトコルに関して理解が漠然としている上、Javaのインタフェースと似ている気がしたので調べてみました!

そもそも「プロトコル」とは

まずは、言葉そのものを紐解いていきましょう。

「プロトコル」という言葉は、外交で用いられている言葉です。

外交官の集まりが催されると、様々な国の人が集まります。

異なる言語や宗教によって、誤解を招くことがあります。

そのような誤解を防ぐために、汎用的な儀礼を定めています

これが「プロトコル」です。

余談ですが……、
実際の外交のプロトコルでは、服装や国旗の扱い方、
参加者の座る位置まで定められているそうです😲

IT業界でいう「プロトコル」とは

「さまざな通信機器間で通信を行う際のルールや手順」であると言えます。

「ネットワーク通信のプロトコル」というのがメジャーですね。

HTTPや、TCPなど、最後に「P」がつく用語は基本的にプロトコルです(例外もありますが)。

Swiftでいう「プロトコル」とは

「プロトコル」について掴めてきましたね。
それでは次にいきましょう。

プロトコルは、ざっくりいうと「決まり事を定める」ということでした。

Swiftのプロトコルも同様で、クラスや構造体(Enum)が保持するフィールド変数、メソッドなどの決まり事を定めるものです。

Javaでいうインターフェースに相当します。

プロトコルを実際に使ってみる

それでは、実際のコードを見ていきましょう!

プロトコルの定義

protocol Calc {
    var num1: Int {set get}
    var num2: Int {set get}

    func sum() -> Int
}

プロトコルの適合

struct Values: Calc {
    var num1: Int
    var num2: Int

    func sum() -> Int {
        return num1 + num2
    }
}

プロトコルの使用

let values = Values(num1: 10, num2: 20)
print(values.sum())

なぜプロトコルを使用するのか

実装する前に、設計を行いますよね。

それを、コードで設計書をかけるようなイメージです。

空っぽの変数、空っぽのメソッドを予め定義しておき、実際に機能させるときに設計書であるプロトコルを引っぱって(適合:conform)使う。

そのようなイメージです。

こうする事で、クラスをどのように構成するか枠組みを作成することができます。

プロトコルの特徴

注意すべき点も含めて、特徴を紹介します。

プロトコルの特徴
  • プロパティの指定はvarのみ(letは使用できない)
    • 定数を使用することを想定していても、varを定義する
    • 「get」や「set」で該当するプロパティが読み込み専用か、代入可能か指定する
  • 定数を使用する場合、set(代入)ができない「get」のみ指定する
    • 「set」のみは指定できない!
  • 複数のプロトコルを適合できる
    • クラスは1つの親クラスしか持てない(つまり、継承できるのは1つ)が、プロトコルであれば複数の物を引き継ぐことができる
  • 構造体を使用できる
    • 通常、共通処理を1つのクラスにまとめて、それを継承してそれぞれのクラスで実装する。
      しかし、値を保持する構造体では、クラスの継承などが行えない
    • プロトコルを使用することで、継承と同等のことが行える

以下は、適合するときのサンプルコードです。

// 構造体の場合
struct test: protocol {
    // code
}

// クラスの場合
class testClass: protocol, protocol2 {
    // code
}

// 継承したクラスの場合
class testInheritanceClass: protocol, protocol2 {
// code
}

プロトコルとインターフェースの違い

下記の記事では、より詳しく、厳密に違いを述べていらっしゃいます。

参考文献

プロトコルを理解する - Qiita
プロトコルはjavaでいうところのインターフェイスに近い。クラスの実装はどうあれプロトコルに準拠したオブジェクトは実装しなければいけないメソッドが決定される。(オプションでなければ実装しなければ…
タイトルとURLをコピーしました