この記事は何?
Swiftプログラミングにおけるプロトコルについて基本の部分を調べました。
Swiftを基礎から学ぶには
自著、工学社より発売中の「まるごと分かるSwiftプログラミング」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。
実行環境
Xcode10.2.1
Swift5.x
プロトコル?
ゴースト・プロトコル
スパイ映画 Mission: Impossible シリーズにはこんなセリフが必ずある。
「例によって君もしくは君のメンバーが捕らえられ、或いは殺されても当局は一切関知しないから、そのつもりで。」
要は「任務を実行した結果、失敗しても知らんぷりするよ」ってこと。
もっと言うと...
「何かあっても知らんぷりするから、そのつもりで実行してね」ってこと。
スパイ活動って大変ですね。
この「知らんぷりする約束」を映画の中で「ゴースト・プロトコル」と呼んでいる。
バレても知らんぷりできるから、スパイ任務ができるんですね。
Swiftプログラミングでのプロトコル
「あるデータ型オブジェクトが何かを実行するときのルール」と言える。
逆に言うと...
「ルールに従っているから、それできるよ」となる。
あるデータ型がプロトコルに準拠していれば、何かが出来ることが保証されるんですね。
CustomStringConvertibleプロトコルに準拠する
こんな構造体があったとして
struct Fruit {
    var emoji: String
    var name:  String
}
apple と banana オブジェクトを生成して...
コンソール出力する。
let apple = Fruit(emoji: "🍎", name: "Apple")
let banana = Fruit(emoji: "🍌", name: "Banana")
print(apple)
print(banana)
何が出力されるか。
🍎かな?Apple かな?
🍌かな?Banana かな?
Fruit(emoji: "🍎", name: "Apple")
Fruit(emoji: "🍌", name: "Banana")
思ってたのと、違う。
テキトー感がスゴい。(イニシャライザのまんま)
出力するルール
print()関数を実行したら...
「description プロパティを出力する」というルールがある。
これが CustomStringConvertible プロトコル。
プロトコルに準拠させる
print() 関数でイイ感じに出力させるように、Fruit 型を CustomStringConvertible に準拠させると...
struct Fruit: CustomStringConvertible {
    var emoji: String
    var name:  String
    
    var description: String {
        return "\(self.name) \(self.emoji)"
    }
}
description は計算プロパティを使って、値を返しています。
コンソール出力すると...
Apple 🍎
Banana 🍌
いろんなプロトコル
Swiftには標準で、いくつものプロトコルが用意されています。
- Equatable
- Comparable
- Codable
- ...
その型が何かしらプロトコルに準拠していることで動作が保証できるので、プログラムが安全になるという仕組みなんですね。