プロトコルの定義と準拠

Swiftにおけるプロトコルの定義と準拠について、詳しく説明します。


プロトコルの概要

プロトコル(Protocol)は、クラス、構造体、列挙型が共通の機能を提供するためのインターフェースのような仕組みです。プロトコルは、プロパティメソッドシグネチャ(型と名前)だけを定義し、それを準拠する型が実装を提供します。


プロトコルの定義方法

プロトコルはprotocolキーワードを使って定義します。

swift
protocol Greetable { var name: String { get } func greet() }

この例では、Greetableというプロトコルが、

  • 読み取り専用のnameプロパティ(getのみ)

  • 引数なしで戻り値もないgreet()メソッド

の実装を求めています。


プロトコルへの準拠

型(クラス、構造体、列挙型)は、プロトコルに**準拠(conform)**することで、そのプロトコルで定義されたすべての要件を満たす必要があります。準拠はコロン(:)を使って明示します。

swift
struct Person: Greetable { var name: String func greet() { print("こんにちは、\(name)です。") } }

このPerson構造体はGreetableプロトコルに準拠しており、nameプロパティとgreet()メソッドを実装しています。


プロトコルの利用例

プロトコルを使うと、異なる型に共通の振る舞いを持たせることができ、抽象化ポリモーフィズムが可能になります。

swift
func sayHello(to greeter: Greetable) { greeter.greet() } let person = Person(name: "太郎") sayHello(to: person) // 出力: こんにちは、太郎です。

プロトコル継承

プロトコルも他のプロトコルを継承できます。

swift
protocol PoliteGreetable: Greetable { func sayGoodbye() }

複数のプロトコル準拠

1つの型が複数のプロトコルに同時に準拠することも可能です。

swift
protocol Identifiable { var id: String { get } } struct User: Greetable, Identifiable { var name: String var id: String func greet() { print("やあ、\(name)です。IDは\(id)です。") } }

プロトコルとクラス制約(制限)

プロトコルに**クラス専用(class-only)**の制約を付けることもできます(AnyObjectを使う)。

swift
protocol ViewControllerDelegate: AnyObject { func didTapButton() }

これはクラスのみが準拠でき、構造体や列挙型は準拠できません。


まとめ

項目 説明
プロトコル 型に実装を要求するための仕様書(インターフェース)
準拠 型がプロトコルの要件を満たすように実装すること
使用目的 共通の振る舞いを強制・抽象化・再利用性向上
複数準拠 型は複数のプロトコルに準拠可能
クラス制約 AnyObjectを使ってクラスのみに制限可能

生成日:2025/05/04