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の理解が一気に深まります。
まとめ
Swiftのprotocol(プロトコル)は、クラスや構造体に「どのような機能を持つべきか」をあらかじめ示すための仕組みであり、柔軟な設計を可能にする大切な概念です。記事全体を振り返ると、プロトコルは単なる“決まりごと”ではなく、複数の型に共通のふるまいを与えることで、コードの見通しを良くし、再利用性や拡張性を高める重要な役割を果たしていることがわかります。特にSwiftの場合、struct(構造体)にもプロトコルを適用できる点は非常に魅力的で、柔軟な型設計を実現しやすくなっています。プロトコルを使いこなせるようになると、iOSアプリ開発で頻繁に登場するデリゲートパターンや画面同士の連携処理などにも自然と対応できるようになり、コード全体の構造も整い、メンテナンスしやすいアプリ設計が可能になります。
また、プロトコルを利用した配列操作や引数としての利用、複数のプロトコルの組み合わせなど、記事で紹介されている活用方法を振り返ると、プロトコルは単なる“型”ではなく、Swiftにおける多様な場面で利用できる非常に強力な考え方であることが理解できます。さまざまなクラスや構造体に共通機能を持たせたいとき、継承ではなくプロトコルを使うことで機能の整理がしやすくなり、複雑な処理でも柔軟に対応できます。特に動作を組み合わせるときに直感的でわかりやすく、アプリの設計全体が整理されていきます。Swiftの言語仕様におけるプロトコル中心の設計思想にも触れながら、プロトコルがアプリ開発においてどれほど価値があるかを自然に実感できたのではないでしょうか。
さらに、プロトコルの名前の付け方や実装のコツを理解すると、コードの意味がより明確になり、後から見たときの読みやすさも大きく向上します。「〜able」「〜ing」などの語尾で動作を示す命名方法は、初心者でもすぐに取り入れられる実践的な技法であり、プロトコルが担う役割を直感的に理解しやすくします。こうした命名の工夫により、プロトコルは単なる規約を超え、チーム開発でも大いに役立つ重要な設計要素となります。実際のSwift開発では、プロトコルは画面間通信、UIイベント処理、データ管理など幅広い場面で登場するため、早い段階でその考え方に慣れておくことで、より洗練されたアプリを作れるようになります。
サンプルプログラムでプロトコルの役割を再確認
下記は、記事の内容を踏まえ、プロトコルを使って複数の型に共通動作を与える例をさらに発展させたサンプルコードです。異なるクラスや構造体が同じプロトコルを採用することで、統一的に扱えることを改めて確認できます。
// 複数の動作をまとめて表現するプロトコル
protocol Performer {
func act()
func speak()
}
// クラスによる実装例
class Actor: Performer {
func act() {
print("劇で演じる")
}
func speak() {
print("セリフを話す")
}
}
// 構造体による実装例
struct Narrator: Performer {
func act() {
print("身振りで説明する")
}
func speak() {
print("物語を語る")
}
}
// 共通の配列で扱う例
let performers: [Performer] = [Actor(), Narrator()]
for p in performers {
p.act()
p.speak()
}
このサンプルでは、クラスと構造体の両方がPerformerプロトコルを採用し、それぞれが独自の動作を実装しています。プロトコルを用いることで、複数の異なる型をまとめて扱えるようになるため、アプリ全体の構造がシンプルになり、拡張にも対応しやすくなります。Swiftではこのようなプロトコル中心の設計が当たり前のように活用されているため、実践の中で繰り返し触れて理解を深めることが大切です。
生徒
「プロトコルって、クラスや構造体に“必要な機能を持たせる”ためのすごく便利な仕組みなんですね!」
先生
「そうです。プロトコルを理解すると、Swiftの設計がぐっと楽になりますし、複数の型をうまく統一して扱えるようになるんですよ。」
生徒
「クラスでも構造体でも共通の機能を使えるのが便利ですね。配列にまとめて処理できるのも、すごく使い道が多そうです!」
先生
「ええ、その通りです。プロトコルはSwift開発の核とも言える要素なので、ぜひどんどん練習してみてください。」
生徒
「今日の内容をしっかり復習して、実際のアプリづくりにも活かしていきます!」