Protocol Composition
Kombinieren Sie mehrere Protocol-Anforderungen mit &.
Protocol Composition ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Protokolle kombinieren
Manchmal muss ein Wert mehreren Protokollen gleichzeitig entsprechen. Swift ermöglicht es Ihnen, Protokolle mit dem Operator & zu kombinieren: SomeProtocol & AnotherProtocol.
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }Ein kombinierter Parameter
Ein Parameter vom Typ Named & Aged akzeptiert jeden Wert, der beiden Protokollen entspricht.
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged {
let name: String
let age: Int
}
func intro(_ x: Named & Aged) {
print(x.name + " is " + String(x.age))
}
intro(Person(name: "Sam", age: 28))Warum keine Vererbung?
Mit Komposition können Sie am Aufrufort beide Protokolle verlangen, ohne ein neues kombiniertes Protokoll zu erstellen. Dadurch bleiben Protokolle klein und wiederverwendbar.
protocol Drawable { func draw() -> String }
protocol Resizable { func resize(_ f: Double) -> String }
struct Icon: Drawable, Resizable {
func draw() -> String { "drawing" }
func resize(_ f: Double) -> String { "x" + String(f) }
}
func render(_ v: Drawable & Resizable) {
print(v.draw(), v.resize(2))
}
render(Icon())Drei oder mehr
Sie können mit zusätzlichen &-Operatoren beliebig viele Protokolle verketten.
protocol A { func a() -> String }
protocol B { func b() -> String }
protocol C { func c() -> String }
struct X: A, B, C {
func a() -> String { "a" }
func b() -> String { "b" }
func c() -> String { "c" }
}
func use(_ v: A & B & C) { print(v.a(), v.b(), v.c()) }
use(X())Komposition mit einer Klasse
Sie können einen Klassentyp mit Protokollen kombinieren: SomeClass & SomeProtocol verlangt, dass der Wert zu dieser Klasse oder einer Unterklasse gehört UND dem Protokoll entspricht.
class Vehicle { var speed = 0 }
protocol Electric { var battery: Int { get } }
class Tesla: Vehicle, Electric { var battery = 100 }
func check(_ v: Vehicle & Electric) {
print(v.speed, v.battery)
}
check(Tesla())Eine Komposition zurückgeben
Eine Funktion kann einen kombinierten Typ zurückgeben und dem Aufrufer dadurch zusichern, dass das Ergebnis allen aufgeführten Protokollen entspricht.
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged { let name: String; let age: Int }
func makePerson() -> Named & Aged {
Person(name: "Eve", age: 22)
}
let p = makePerson()
print(p.name, p.age)typealias für eine Komposition
Geben Sie einer Komposition mit typealias einen gut lesbaren Namen, damit Sie sie wiederverwenden können, ohne die &-Kette zu wiederholen.
protocol Codable2 { func encode() -> String }
protocol Loggable { func log() -> String }
typealias Persistable = Codable2 & Loggable
struct Record: Persistable {
func encode() -> String { "data" }
func log() -> String { "logged" }
}
func save(_ r: Persistable) { print(r.encode(), r.log()) }
save(Record())Komposition in Collections
Sie können Werte kombinierter Typen in Arrays speichern und auf die Member aller Protokolle jedes Elements zugreifen.
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct P: Named, Aged { let name: String; let age: Int }
let group: [Named & Aged] = [P(name: "A", age: 1), P(name: "B", age: 2)]
for g in group { print(g.name, g.age) }Komposition mit Standardprotokollen
Komposition ist besonders nützlich mit Bibliotheksprotokollen. Fordern Sie beispielsweise sowohl CustomStringConvertible als auch Equatable an.
func report<T>(_ items: [T]) where T: CustomStringConvertible & Equatable {
for i in items { print(i.description) }
}
report([1, 2, 3])Leere Protokolle als Marker
Mit Komposition können Sie ein Markerprotokoll (ohne Anforderungen) mit einem funktionalen Protokoll verbinden, um die Absicht im Typsystem auszudrücken.
protocol Secure {}
protocol Sendable2 { func send() -> String }
struct Packet: Secure, Sendable2 {
func send() -> String { "sent securely" }
}
func transmit(_ p: Secure & Sendable2) { print(p.send()) }
transmit(Packet())Komposition vs. Generics
Komposition (A & B) blendet den konkreten Typ aus, während Generics (<T: A & B>) ihn erhalten. Verwenden Sie Generics, wenn Sie Parameter- und Rückgabetypen aufeinander beziehen müssen.
protocol A { func a() -> String }
protocol B { func b() -> String }
struct S: A, B { func a() -> String { "a" }; func b() -> String { "b" } }
func generic<T: A & B>(_ x: T) -> T { print(x.a(), x.b()); return x }
_ = generic(S())Kurzer Test
Testen Sie Ihr Verständnis der Protokollkomposition.
Zusammenfassung
Mit der Protokollkomposition und & können Sie gleichzeitig die Konformität zu mehreren Protokollen (und optional einer Klasse) verlangen, ohne ein neues kombiniertes Protokoll zu definieren. Sie können Kompositionen mit typealias benennen und in Parametern, Rückgabewerten und Collections verwenden. Außerdem haben Sie gesehen, wie sich Komposition und Generics darin unterscheiden, ob konkrete Typen erhalten bleiben.
Häufig gestellte Fragen
Ist die Lektion „Protocol Composition“ kostenlos?
Ja — der vollständige Text von „Protocol Composition“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Protocol Composition“?
Kombinieren Sie mehrere Protocol-Anforderungen mit &. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Protocol Composition“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Protokolle als Verträge
- Standardimplementierungen in Extensions
- Protocol Composition
- Bedingte Konformität