プロトコルとは
複数のクラスで同じメソッドを持つ場合、それぞれのクラスで同じメソッドを定義する必要がありますが、プロトコルを使えば、共通のインターフェースを定義することができ、コードの再利用性を高めることができます。
また、プロトコルにはプロパティやイニシャライザなど、メソッド以外の要素も含めることができます。
プロトコルを実装するには、クラスや構造体、列挙型の宣言の際に、プロトコル名をコロンで繋いで列挙するだけで実装することができます。
例文
以下は異なる種類の動物に共通のインターフェースを定義しています。
具体的には、動物が鳴くこと、走ること、食べることができることを表すプロトコルAnimalを定義しています。
// Animalプロトコルの定義 protocol Animal { func speak() // 鳴く func run() // 走る func eat() // 食べる } // Dogクラスの定義 class Dog: Animal { func speak() { print("ワンワン") } func run() { print("走るよ!") } func eat() { print("おいしい!") } } // Catクラスの定義 class Cat: Animal { func speak() { print("ニャーニャー") } func run() { print("疾走する!") } func eat() { print("ごちそうさま!") } } // 動物を使って遊ぶ関数 func playWithAnimal(animal: Animal) { animal.speak() animal.run() animal.eat() } // DogとCatを作成して、playWithAnimal関数で遊ぶ let myDog = Dog() let myCat = Cat() playWithAnimal(animal: myDog)
playWithAnimal(animal: myCat)
Animalプロトコルに準拠するDogクラスとCatクラスを定義し、playWithAnimal関数で共通のインターフェースを使うことが出来ます。
playWithAnimal(animal: myDog)
この場合、myDogはDogクラスのインスタンスであり、playWithAnimalで実装される.speak()はDogクラスの関数となります。
つまり、「ワンワン」「走るよ!」「おいしい!」が表示されます。
同じように、
playWithAnimal(animal: myCat)
この場合、myCatはCatクラスのインスタンスであり、playWithAnimalで実装される.speak()はCatクラスの関数となります。
つまり、「ニャーニャー」「疾走する!」「ごちそうさま!」が表示されます。