プロトコルとエクステンション (1/4)
作成:2014-11-08 11:03
更新:2014-11-08 11:03
更新:2014-11-08 11:03
■プロトコルとは?
Swiftは、クラスに用意されたメソッドを呼び出して処理を行います。何かのオブジェクトを扱うとき、「その中にどんなメソッドが用意されているか」を考えることになります。
ここに、全くクラスの異なるオブジェクトが複数あったとしましょう。それらをまとめて何らかの処理を行うとき、「すべてに共通したメソッド」が用意できると非常に助かりますね?
けれど、クラスが異なっている場合、それぞれに同じメソッドが用意されているかどうかはまったくわかりません。それぞれのクラスが継承関係にあれば、スーパークラスにメソッドを用意しておくことで何とかなりますが、継承関係にないクラスどうしに「同じメソッドがあることを保証する」ということはできないのです。「プログラマが気を利かせて同じものを用意しておいた」ではなく、「必ず、このメソッドが用意されている」という保証ができるか、ということですね。
これを可能にするのが、「プロトコル」です。プロトコルは、プロパティとメソッドの宣言だけを記述したクラスのような形をしています。書き方を整理するとこうなるでしょう。
メソッドは、{}の実装部分は不要です。単に「func ○○ (✕✕)->△△;」といった宣言部分だけを書けばOKです。
こうして作成したプロトコルは、クラスに組み込んで利用されます。これは、クラスの継承と基本的に同じような書き方をします。
クラスの継承を利用している場合は、「○○ : スーパークラス名 , プロトコル名……」というように、継承元のクラス名の後にカンマで区切って記述します。またプロトコルは複数を設定できますが、この場合もそれぞれをカンマで区切って記述してやります。
こうしてプロトコルを設定されたクラスでは、プロトコルに用意されたメソッドをすべて実装しなければいけません。実装しないとエラーになって実行できないのです。複数のクラスにプロトコルを設定すれば、それらのクラスに「必ず、プロトコルのメソッドが実装される」ということになるわけです。
ここに、全くクラスの異なるオブジェクトが複数あったとしましょう。それらをまとめて何らかの処理を行うとき、「すべてに共通したメソッド」が用意できると非常に助かりますね?
けれど、クラスが異なっている場合、それぞれに同じメソッドが用意されているかどうかはまったくわかりません。それぞれのクラスが継承関係にあれば、スーパークラスにメソッドを用意しておくことで何とかなりますが、継承関係にないクラスどうしに「同じメソッドがあることを保証する」ということはできないのです。「プログラマが気を利かせて同じものを用意しておいた」ではなく、「必ず、このメソッドが用意されている」という保証ができるか、ということですね。
これを可能にするのが、「プロトコル」です。プロトコルは、プロパティとメソッドの宣言だけを記述したクラスのような形をしています。書き方を整理するとこうなるでしょう。
protocol プロトコル名 {
……プロパティやメソッドの宣言……
}
メソッドは、{}の実装部分は不要です。単に「func ○○ (✕✕)->△△;」といった宣言部分だけを書けばOKです。
こうして作成したプロトコルは、クラスに組み込んで利用されます。これは、クラスの継承と基本的に同じような書き方をします。
class クラス名 : プロトコル名 {……}
クラスの継承を利用している場合は、「○○ : スーパークラス名 , プロトコル名……」というように、継承元のクラス名の後にカンマで区切って記述します。またプロトコルは複数を設定できますが、この場合もそれぞれをカンマで区切って記述してやります。
こうしてプロトコルを設定されたクラスでは、プロトコルに用意されたメソッドをすべて実装しなければいけません。実装しないとエラーになって実行できないのです。複数のクラスにプロトコルを設定すれば、それらのクラスに「必ず、プロトコルのメソッドが実装される」ということになるわけです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
※関連コンテンツ