口内炎は根性で治ると思っています。
どうも、メモリアインクの福嶋です!
今回はSwiftにおけるプロトコル(Protocol)について、一歩踏み込んで解説していきたいと思います!
この記事を読んで分かること…
・そもそもProtocolって何なのか
・クラスや構造体、列挙型とどう違うの?
・実際のProtocolの使用方法
・Protocolを使うことのメリット
プロトコルとは
プロトコルについて
Swiftのプロトコルは、型が特定のプロパティ、メソッド、または他の要件を提供することを保証するための方法を提供するものです。
プロトコルを使用することで、コードの柔軟性が高まり、異なる型間での共通の機能を定義することができます。
クラスや構造体、列挙型との違い
以前解説した、設計書として役割を果たすクラスや構造体、列挙型とはどう違うのか?
前項でも少し触れましたが、プロトコルではクラスや構造体、列挙型とは違って、設計書ではなく要件として役割を果たします。つまりプロトコル内では実際の処理は定義はしません。
「このクラスや構造体には必ずこの値(或いはメソッド、イニシャライザ)を定義してくださいね〜」を定義するものになります。
要は、設計図を書くための指示書のようなものですね〜
クラスや構造体、列挙型についてよく知らないよ〜って方は以下の記事をご参考ください!
それでは次項からはSwiftのプロトコルの利用方法についてさらに詳しく見ていきましょう!
プロトコルの使い方
プロトコルの要件定義
プロトコル内で定義する要件としては、以下のようなものがあります。
- プロパティ要件:
var
キーワードを使用して定義され、{ get }
または{ get set }
でアクセスレベルを指定します。 - メソッド要件: 実装を提供することなく、メソッドの名前、パラメータ、戻り値の型を定義します。
- 初期化子要件: 特定の初期化子を持つことを要求します。
以下で具体的な定義方法を、実際のコードで示します。
protocol SomeProtocol {
// { get set } - 読み書き可能なプロパティ要件
var mustBeSettable: Int { get set }
// { get } - 読み取り専用のプロパティ要件
var doesNotNeedToBeSettable: Int { get }
// 初期化子要件
init(someParameter: Int)
// メソッド要件
func someMethod()
}
プロトコルは、protocol
キーワードを使って定義されます。
プロトコルが要求するメソッドやプロパティは、実際のコードブロックを提供するのではなく、そのシグネチャ(名前、パラメータ、戻り値の型など)のみを定義します。
プロトコルの準拠
クラス、構造体、または列挙型は、プロトコルの要件を満たすことによって、プロトコルに準拠することを宣言します。
以下では、先ほど定義したSomeProtocol
プロトコルに準拠した、SomeStructure
構造体を定義しました。
プロトコルで宣言した要件が全て満たされ、かつその詳細を記述していることに注目してください。
struct SomeStructure: SomeProtocol {
var mustBeSettable: Int
var doesNotNeedToBeSettable: Int
init(someParameter: Int) {
// 初期化子の実装
}
func someMethod() {
// メソッドの実装
}
}
プロトコルを使用するメリット
その1: コードの抽象化
プロトコルを使用すると、コードを抽象化できます。これにより、具体的な実装の詳細から抽象的なインターフェースへと焦点を移すことができます。この抽象化により、コンポーネント間の疎結合が促進され、各コンポーネントが互いに独立して動作しやすくなります。
その2: コードの再利用性の向上
プロトコルを使用すると、異なるクラスや構造体が同じプロトコルに準拠することで、同じインターフェースを共有できます。これにより、プロトコルに準拠する任意の型に対して共通のコードを書くことができ、結果としてコードの再利用性が向上します。
その3: 型安全の強化
Swiftは型安全な言語であり、プロトコルを使用することで、この型安全性をさらに強化できます。プロトコルによって定義された要件を満たしている限り、異なる型でも同じプロトコルに準拠することができます。これにより、エラーをコンパイル時に検出しやすくなり、実行時エラーのリスクを減らします。
その4: デリゲーションの実装
プロトコルは、デリゲーションパターンの実装を容易にします。デリゲーションパターンを使用すると、クラスや構造体は特定の機能を他の型のインスタンスに委任できます。プロトコルにより、どのメソッドがデリゲートによって実装されるべきかを明確に定義できます。
その5: 柔軟性と拡張性
プロトコルは柔軟性と拡張性を提供します。新しい機能や要件が出現した場合でも、既存のコードを変更することなく、新しい型にプロトコルを準拠させることで、システムに統合することができます。
まとめ
お疲れ様でした!
Swiftが型安全性が高い言語と言われる所以として、プロトコルが大きく役割を担います。
プロトコルを正しく使いこなすことで、より安全で見やすいコードを書くことが出来ますので、
ぜひこの機会に理解しておきましょう〜
この記事があなたのスキルアップに役立ったなら、次のキャリアステップを踏み出す絶好の機会かもしれません。エンジニアとしてのさらなる成長と挑戦を求めるなら、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
コメント
コメント一覧 (3件)
[…] Delegateパターンの構成として、大きく3つの役割が必要となります。①Delegateプロトコル:ここでは、任せたい処理をメソッドとして定義します。プロトコルなのであくまでもざっくりとした要件のみを記述します。(プロトコルについては、こちらで詳しく解説しています!)ここで定義したメソッドを、デリゲートメソッドと呼びます。 […]
[…] 【iOS】Swiftにおけるプロトコル(Protocol)について深く理解する […]
[…] 【Swift】プロトコル(Protocol)について徹底的に解説 […]