現在、書籍で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)使う。
そのようなイメージです。
こうする事で、クラスをどのように構成するか枠組みを作成することができます。
プロトコルの特徴
注意すべき点も含めて、特徴を紹介します。
以下は、適合するときのサンプルコードです。
// 構造体の場合
struct test: protocol {
// code
}
// クラスの場合
class testClass: protocol, protocol2 {
// code
}
// 継承したクラスの場合
class testInheritanceClass: protocol, protocol2 {
// code
}
プロトコルとインターフェースの違い
下記の記事では、より詳しく、厳密に違いを述べていらっしゃいます。
参考文献
プロトコルを理解する - Qiita
プロトコルはjavaでいうところのインターフェイスに近い。クラスの実装はどうあれプロトコルに準拠したオブジェクトは実装しなければいけないメソッドが決定される。(オプションでなければ実装しなければ…