本文へスキップ
BecomeCoder

Swift(iOSアプリ)コース · 第4章 型と関数でモデルを作る · レッスン18

protocol ― 「できること」を約束する

ブラウザで完結

導入

「あいさつできる型」「識別番号を持つ型」のように、満たすべき約束(インターフェース) を決めるのが protocol です。SwiftUIの ViewIdentifiable も、正体はprotocolです。

説明

protocol は「これができる型」の約束事(メソッドやプロパティの一覧)を宣言します。型は : で protocol に 準拠(conform) し、約束を実装します。

protocol Greetable {
    func greeting() -> String
}

struct Japanese: Greetable {
    func greeting() -> String { "こんにちは" }
}

struct English: Greetable {
    func greeting() -> String { "Hello" }
}

let people: [Greetable] = [Japanese(), English()]
for p in people {
    print(p.greeting())
}

[Greetable] は「Greetableに準拠したもの何でも」入る配列。中身が Japanese でも English でも、同じ greeting() で呼べます。これが ポリモーフィズム(多態性)。「共通の約束さえ守っていれば、実体が違っても同じように扱える」というアプリ設計の要です。

SwiftUIで struct ContentView: View と書くのも、「ContentViewはViewプロトコルに準拠する(=画面として振る舞える)」という約束です。次の章からいよいよSwiftUIに入ります。

やってみよう

Greetable に準拠する新しい struct(例:French)を足して、people 配列に加えてみましょう。

演習

Greetable に準拠する struct Korean を作り、greeting() が「アンニョン」を返すようにして、Korean().greeting()print してください。

ヒント1を見る

struct Korean: Greetable { func greeting() -> String { "アンニョン" } }

ヒント2を見る

print(Korean().greeting())

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Swift / SwiftUI — ブラウザ内で実行(学習用)

Swiftの教材サブセットを動かす学習用ランナーを読み込みます。ふつうのコードは print の出力を表示し、SwiftUI(struct: View)を書くと右にiPhone風のライブプレビューを描画します(本物のXcode/Swiftコンパイラではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。