Swiftのprotocol(プロトコル)とは?初心者にもわかる基本と実装例
生徒
「Swiftのprotocolって何ですか?クラスとか構造体とは違うんですか?」
先生
「いい質問ですね。protocolは、簡単に言うと“やるべきことの約束”を定義する仕組みです。」
生徒
「約束?なんか抽象的で難しそう…」
先生
「大丈夫ですよ。たとえば“歌える”という機能を持った存在がいるとしましょう。動物でも人間でも、歌えるなら共通のprotocolを使えるんです。」
1. Swiftのprotocol(プロトコル)とは?
Swiftのprotocol(プロトコル)とは、「ある機能を持つことを約束する」ための型です。日本語では「規約」や「仕様」と訳されることもあります。
たとえば、「歩く」「走る」「歌う」といった機能を、クラスや構造体が持つべきだと指定するのがprotocolの役割です。これにより、コードを統一的に扱いやすくなります。
2. protocolの基本的な書き方
まずは、protocolの定義と、それを使うクラスの実装方法を見てみましょう。
protocol Singable {
func sing()
}
class Person: Singable {
func sing() {
print("ラララ〜♪")
}
}
この例では、Singableというプロトコルを作り、sing()というメソッドを定義しています。そしてPersonクラスがそれを実装しています。
3. プロトコルを使う意味は?
プロトコルを使うことで、「この型はこの機能を持っている」と明示的に示すことができます。
たとえば、いろいろな型(クラス・構造体)に共通の機能を持たせたいとき、プロトコルを使うと一貫したコードが書けます。
4. 構造体でも使えるSwiftのprotocol
Swiftの大きな特徴として、プロトコルはclass(クラス)だけでなく、struct(構造体)にも使えるという点があります。
次のコードは、構造体がプロトコルを実装する例です。
protocol Walkable {
func walk()
}
struct Dog: Walkable {
func walk() {
print("テクテク歩くワン!")
}
}
let dog = Dog()
dog.walk()
このように、Dog構造体でもプロトコルを使って機能を実装できます。
5. プロトコルを引数や配列に使う
プロトコルは、共通の機能を持ったオブジェクトをひとまとめに扱うときにも使えます。たとえば次のように書くと便利です。
protocol Drawable {
func draw()
}
class Circle: Drawable {
func draw() {
print("円を描く")
}
}
class Square: Drawable {
func draw() {
print("四角を描く")
}
}
let shapes: [Drawable] = [Circle(), Square()]
for shape in shapes {
shape.draw()
}
このコードでは、Drawableというプロトコルを使って、異なるクラスのインスタンス(CircleとSquare)をDrawable型の配列にまとめています。
6. 複数のプロトコルを組み合わせて使う
Swiftでは、複数のプロトコルを同時に使うこともできます。次のようにコンマ区切りで記述します。
protocol Runnable {
func run()
}
protocol Jumpable {
func jump()
}
struct Athlete: Runnable, Jumpable {
func run() {
print("走る!")
}
func jump() {
print("ジャンプ!")
}
}
このようにして、1つの型が複数の機能を持っていることを明示できます。
7. protocolの命名のコツ
Swiftではプロトコルの名前をつけるとき、動作を表す言葉に「〜able」や「〜ing」をつけるのが一般的です。たとえば:
- 歌う →
Singable - 走る →
Runnable - 描く →
Drawable
これにより、そのプロトコルが何をするのか直感的に理解しやすくなります。
8. protocolはSwiftのオブジェクト指向でも重要な役割
Swiftのprotocolは、クラスや構造体の設計をシンプルにし、柔軟で再利用しやすいコードにするための重要な要素です。
クラス継承よりも柔軟に設計できるため、iOSアプリ開発でも頻繁に使われています。初心者の方も、まずはprotocolで「やるべきこと」を明確にする練習をすると、Swiftの理解が一気に深まります。