プロトコルエクステンションと型エクステンション
プロトコルエクステンション(条件付きの場合も含め、プロトコルにデフォルト実装を追加)と型エクステンション(具体的な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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- プロトコルとエクステンションの基本
- プロトコルエクステンションと型エクステンション
- static要件とインスタンス要件