機能を保証するプロトコル
プロトコルとは
クラスや構造体の内容(プロパティとメソッド)をあらかじめ定義しておく機能です。
使用におけるメリット・特徴として
・プロトコルにプロパティ・メソッドを書いておけば、中身の処理が書かれていなくとも、そのプロパティ・メソッドの呼び出し処理を書くことができる(※)
・Swiftの構造体は継承ができないが、プロトコルを親(スーパー)クラスの代わりに使って似たようなことができる
・プロトコルは1つのクラスに複数適合でき、プロトコルにプロトコルを継承することもできる
Appleが提供しているクラスの利用時に、このプロトコルの仕組みが必要な場合がよく見られますので、しっかりと把握しておきましょう。
※使用例として、Apple提供クラスに呼び出したいプロパティ・メソッドがあったとき、それをプロトコルで用意しています。その提供クラスを使いたいときは、そのプロトコルを処理対象のクラスに適用させ、呼び出されるプロパティ・メソッドの実装をする、といった使われ方がされています。Lecture5_03 独自クラスの値を保存できる処理で出てきます。
また、次の節 Lecture2_04 Swiftコードの書き方: エラー関連処理でもこのプロトコルが出てきますので、そちらでどのようなときに使うのかを確認してみましょう。
プロトコルの宣言 protocol プロトコル名 { ~定義~ }
1 2 3 4 |
protocol Animal{ // protocol プロトコル名 var name: String { get } // 定義したいプロパティ {}の中身は、読み書き可能かどうかの指定 func bark() -> String // 定義したいメソッド {}と処理の中身を省いて記載 } |
プロトコルの中にプロパティを記載する上で、定数letは使えません。
このプロパティを実装してね、という約束事なので、値がプロパティ内で固定されるletは使えないというわけです。
また、プロパティ宣言時の{}の中に書く、読み書き可能かどうかの指定、というのは2種類書き方があります。
{ get }・・・値を取得。let でもvarでも実装可能。読み込み専用。イメージとしてletを使いたいときはこちら。
{ get set }・・・値を取得&設定。varのみ実装可能。読み書き可能。イメージとしてvarを使いたいときはこちら。{ set get }でもOK
実装時にget(値の取得), set(値の設定)の要件を満たしていれば良い、という意味となるためあまり使用上の差異はありません。迷ったら{ get set }を利用しましょう。
プロトコルの適用
プロトコルの適用は、クラス・構造体名の後ろに”: プロトコル名”とつけます。
1 2 3 4 5 6 7 8 9 10 11 |
protocol Animal{ // プロトコルの定義 var name: String { get } func bark() -> String } class Dog: Animal{ // プロトコルが適用されたクラス let name: String = "ポチ" // 定義されたプロパティ・メソッドをコーディング func bark() -> String ( return "わんわん" } } |
上記コード例には記載がありませんが、プロトコルに定義されたもの以外のプロパティ・メソッドもコーディング可能です。
また、複数のプロパティを適用したいときは クラス名: プロトコル名, プロトコル名 という形で”,”(カンマ)で区切ります。