
iOS開発ぜんっぜん分からんわ!!!
iOS開発の足がかりにしようと思い、こちらの書籍を使って学習を進めています。
たった2日でマスターできるiPhoneアプリ開発集中講座
全くアプリ開発に馴染みがない人でも分かりやすい一冊です。iOSとは何か?というところから丁寧に教えてくれます!
プロトコルに関して疑問に感じるとともに、Javaのインタフェースと似ている気がしたので調べてみました!
そもそも「プロトコル」とは
まずは、言葉そのものを紐解いていきましょう。
「プロトコル」という言葉は、外交で用いられている言葉です。
外交官の集まりが催されると、様々な国の人が集まります。
異なる言語や宗教によって、誤解を招くことがあります。
そのような誤解を防ぐために、汎用的な儀礼を定めています。
これが「プロトコル」です。
外交のプロトコルでは、服装や国旗の扱い方、参加者の座る位置などを定めています!
IT業界でいう「プロトコル」とは
「さまざな通信機器間で通信を行う際のルールや手順」であると言えます。
「ネットワーク通信のプロトコル」というのがメジャーですね。
HTTPや、TCPなど、最後に「P」がつく用語は基本的にプロトコルです(例外もありますが)。
Swiftでいう「プロトコル」とは
これまでの説明で何となく掴めたところで、次へいきましょう。
プロトコルは、ざっくりいうと「決まり事を定める」ということでしたね。
Swiftのプロトコルも同様で、クラスや構造体(Enum)が保持するフィールド変数、メソッドなどの決まり事を定めるものです。
Javaでいうインターフェースに相当します。
プロトコルを実際に使ってみる
下記は、例です。
プロトコルの定義
1 2 3 4 5 6 |
protocol Calc { var num1: Int {set get} var num2: Int {set get} func sum() -> Int } |
プロトコルの適合
1 2 3 4 5 6 7 8 |
struct Values: Calc { var num1: Int var num2: Int func sum() -> Int { return num1 + num2 } } |
プロトコルの使用
1 2 |
let values = Values(num1: 10, num2: 20) print(values.sum()) |
なぜプロトコルを使用するのか?
実装する前に、設計を行いますよね。
それを、コードで設計書をかけるようなイメージです。
空っぽの変数、空っぽのメソッドを予め定義しておき、実際に機能させるときに設計書であるプロトコルを引っぱって(適合:conform)使う。
そのようなイメージです。
こうする事で、クラスをどのように構成するか枠組みを作成することができます。
プロトコルの特徴
注意すべき点も含めて、特徴を紹介します。
- プロパティの指定はvarのみ(letは使用できない)
- 定数を使用することを想定していても、varを定義する
- 「get」や「set」で該当するプロパティが読み込み専用か、代入可能か指定する
- 定数を使用する場合、set(代入)ができない「get」のみ指定する
- 「set」のみは指定できない!
- 複数のプロトコルを適合できる
- クラスは1つの親クラスしか持てない(つまり、継承できるのは1つ)が、プロトコルであれば複数の物を引き継ぐことができる
- 構造体を使用できる
- 通常、共通処理を1つのクラスにまとめて、それを継承してそれぞれのクラスで実装する。
しかし、値を保持する構造体では、クラスの継承などが行えない - プロトコルを使用することで、継承と同等のことが行える
- 通常、共通処理を1つのクラスにまとめて、それを継承してそれぞれのクラスで実装する。
下記、適合するときの例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 構造体の場合 struct test: protocol { // code } // クラスの場合 class testClass: protocol, protocol2 { // code } // 継承したクラスの場合 class testInheritanceClass: protocol, protocol2 { // code } |
【補足】プロトコルとインターフェースの違い
下記の記事では、より詳しく、厳密に違いを述べていらっしゃいます。
参考

次のオススメの記事
以下の記事では、iOSに関する基礎知識を集約しています!
随時更新しているので、ぜひ!

たった2日でマスターできるiPhoneアプリ開発集中講座
全くアプリ開発に馴染みがない人でも分かりやすい一冊です。iOSとは何か?というところから丁寧に教えてくれます!