導入
「あいさつできる型」「識別番号を持つ型」のように、満たすべき約束(インターフェース) を決めるのが protocol です。SwiftUIの View も Identifiable も、正体は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())