0Pricing
Swift Academy · レッスン

プロトコルエクステンションと型エクステンション

プロトコルエクステンション(条件付きの場合も含め、プロトコルにデフォルト実装を追加)と型エクステンション(具体的な1つの型にAPIを追加)を比較します。ディスパッチの動作と制約も理解します。

「プロトコルエクステンションと型エクステンション」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。

概要

目標:プロトコル拡張(すべての準拠型にデフォルトの動作を提供)と型拡張(1つの具体的な型にAPIを追加)を使い分けられるようになることです。ディスパッチのルールについても確認します。

プロトコルと準拠

プロトコルは要件を宣言します。型はその要件を実装することで準拠します。

protocol Greeter {
    func greet() -> String
}
struct Person: Greeter {
    var name: String
    func greet() -> String { "Hi, I'm \\(name)" }  // concrete requirement impl
}
print(Person(name: "Ada").greet())

プロトコル拡張によるデフォルト実装

プロトコル拡張では、準拠するすべての型で使用されるデフォルト実装を提供できます。ただし、型独自の実装がある場合はそちらが使われます。

protocol Describable {
    func describe() -> String
}
extension Describable {
    // default for ALL conformers until they override
    func describe() -> String { "No description" }
}

struct Car: Describable { }             // uses default
struct Book: Describable {
    func describe() -> String { "A book" } // custom override
}
print(Car().describe(), Book().describe())

型拡張によるAPI

型拡張は、単一の具体的な型にメソッドや計算プロパティを追加します。格納プロパティは追加できません。

struct Point { var x: Int; var y: Int }

extension Point {
    // add helper just to Point
    var lengthSquared: Int { x*x + y*y }
    func moved(dx: Int, dy: Int) -> Point { Point(x: x+dx, y: y+dy) }
}
let p = Point(x: 2, y: 3)
print(p.lengthSquared, p.moved(dx: 1, dy: -1))

条件付き拡張

プロトコル拡張にwhere句を付けると、準拠する一部の型に動作を追加できます。

protocol Summable { }
extension Int: Summable { }
extension Array where Element: Summable {
    // only for arrays whose elements conform to Summable
    func joinedCount() -> Int { self.count }
}
print([1,2,3].joinedCount())   // works (Int conforms)
 // print(["a","b"].joinedCount()) // not available

ディスパッチの動作(概要)

経験則:メソッドがプロトコル要件で、準拠型がそれを実装している場合は、型の実装が優先されます(動的ディスパッチに近い動作です)。プロトコル拡張でのみ追加されたメソッド(要件ではないもの)は、静的ディスパッチされます。

protocol Speaker { func speak() -> String }
extension Speaker { func speak() -> String { "default" } }

struct Cat: Speaker { }
struct Dog: Speaker {
    func speak() -> String { "woof" } // requirement impl overrides default
}

let s1: Speaker = Cat()
let s2: Speaker = Dog()
print(s1.speak()) // "default" (uses default impl)
print(s2.speak()) // "woof" (Dog provides requirement impl)

let c = Cat()
print(c.speak())  // "default" via extension on protocol

プロトコル拡張と型拡張

確認問題:主な違いは何でしょうか?

まとめ

まとめ:再利用可能なデフォルト実装(必要に応じて条件付き)にはプロトコル拡張を使用し、1つの型を拡張するには型拡張を使用します。ディスパッチにも注意してください。要件の実装は、拡張によるデフォルトメソッドより優先されます。

よくある質問

「プロトコルエクステンションと型エクステンション」レッスンは無料ですか?

はい。「プロトコルエクステンションと型エクステンション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。

「プロトコルエクステンションと型エクステンション」で何を学びますか?

プロトコルエクステンション(条件付きの場合も含め、プロトコルにデフォルト実装を追加)と型エクステンション(具体的な1つの型にAPIを追加)を比較します。ディスパッチの動作と制約も理解します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「プロトコルエクステンションと型エクステンション」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. プロトコルとエクステンションの基本
  2. プロトコルエクステンションと型エクステンション
  3. static要件とインスタンス要件
← Swift Academyに戻る