0Pricing
Swift Academy · Lektion

Bedingte Konformität

Lassen Sie generische Typen nur bei erfüllten Einschränkungen konform werden.

Bedingte Konformität ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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.

Was ist bedingte Konformität?

Bedingte Konformität bewirkt, dass ein generischer Typ nur dann zu einem Protokoll konform ist, wenn seine Typparameter bestimmte Einschränkungen erfüllen. Das klassische Beispiel: Ein Array ist nur dann Equatable, wenn sein Element Equatable ist.

extension Array where Element: Equatable {
    func allEqual(to x: Element) -> Bool {
        allSatisfy { $0 == x }
    }
}

Integriertes Beispiel

Die Standardbibliothek verwendet dieses Prinzip bereits: [Int] ist Equatable, weil Int es ist. Zwei Arrays werden Element für Element auf Gleichheit verglichen.

let a = [1, 2, 3]
let b = [1, 2, 3]
print(a == b)

Bedingte Konformität deklarieren

Schreiben Sie eine Erweiterung, die mithilfe einer where-Klausel eine Protokollkonformität hinzufügt. Hier ist ein Wrapper nur dann Equatable, wenn sein Werttyp dies ebenfalls ist.

struct Pair<T> {
    let first: T
    let second: T
}

extension Pair: Equatable where T: Equatable {
    static func == (l: Pair, r: Pair) -> Bool {
        l.first == r.first && l.second == r.second
    }
}

print(Pair(first: 1, second: 2) == Pair(first: 1, second: 2))

Warum die Einschränkung wichtig ist

Ohne die Einschränkung könnte der Compiler == nicht automatisch erzeugen, da zum Vergleichen des umschlossenen Werts der Wert selbst vergleichbar sein muss. Die where-Klausel liefert genau diese Garantie.

struct Box<T> { let value: T }
extension Box: Equatable where T: Equatable {}

print(Box(value: "hi") == Box(value: "hi"))
print(Box(value: 5) == Box(value: 9))

Bedingtes Codable

Sie können auch bedingt zu Codable konform sein. Ein Container kann nur dann codiert werden, wenn dies auch für sein Element gilt.

struct Wrapper<T> { let payload: T }
extension Wrapper: Codable where T: Codable {}

let w = Wrapper(payload: 42)
let data = try! JSONEncoder().encode(w)
print(String(data: data, encoding: .utf8)!)

Mehrere Einschränkungen

Eine where-Klausel kann mehrere durch Kommas getrennte Anforderungen enthalten.

struct Stack<T> { var items: [T] = [] }

extension Stack where T: Comparable {
    func maxItem() -> T? { items.max() }
}

var s = Stack<Int>()
s.items = [3, 9, 1]
print(s.maxItem()!)

Bedingtes CustomStringConvertible

Machen Sie einen Typ nur dann ausgabefähig, wenn auch seine Inhalte ausgabefähig sind, und setzen Sie die Beschreibungen aus den Elementen zusammen.

struct Labeled<T> { let label: String; let value: T }

extension Labeled: CustomStringConvertible where T: CustomStringConvertible {
    var description: String { label + ": " + value.description }
}

print(Labeled(label: "Age", value: 30))

Verschachtelte bedingte Konformität

Bedingte Konformität lässt sich kombinieren: Ein Array von Arrays mit Int ist Equatable, weil jede Ebene die Einschränkung weitergibt.

let grid1 = [[1, 2], [3, 4]]
let grid2 = [[1, 2], [3, 4]]
print(grid1 == grid2)

Einschränkung auf ein anderes Protokoll

Die where-Klausel kann verlangen, dass das Element zu einem von Ihnen definierten Protokoll konform ist, und dadurch auf diesem Protokoll basierendes Verhalten freischalten.

protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }

extension Array where Element: Priced {
    var totalPrice: Double { reduce(0) { $0 + $1.price } }
}

print([Item(price: 1.5), Item(price: 2.5)].totalPrice)

Same-Type-Einschränkungen

Mit == können Sie einen assoziierten Typ auf einen bestimmten Typ einschränken. Hier gelten die Methoden nur für Arrays aus String.

extension Array where Element == String {
    func joinedUpper() -> String {
        map { $0.uppercased() }.joined(separator: "-")
    }
}

print(["a", "b", "c"].joinedUpper())

So verwendet der Compiler die Einschränkung

Bedingte Konformität ermöglicht es dem Compiler, die Vorteile eines Protokolls genau dann bereitzustellen, wenn sie gültig sind. So bleibt generischer Code sicher und maximal wiederverwendbar.

struct Optional2<T> { let value: T? }
extension Optional2: Equatable where T: Equatable {
    static func == (l: Optional2, r: Optional2) -> Bool { l.value == r.value }
}
print(Optional2(value: 1) == Optional2(value: 1))

Kurzer Test

Testen Sie Ihr Verständnis der bedingten Konformität.

Zusammenfassung

Bedingte Konformität verwendet extension Type: Protocol where ..., um eine Konformität nur dann zu gewähren, wenn Typparameter bestimmte Einschränkungen erfüllen. Sie haben dies für Equatable, Codable und CustomStringConvertible gesehen, einschließlich Protokolleinschränkungen, Same-Type-Einschränkungen (==) und Verschachtelungen. Dadurch bleiben generische Typen sicher und wiederverwendbar.

Häufig gestellte Fragen

Ist die Lektion „Bedingte Konformität“ kostenlos?

Ja — der vollständige Text von „Bedingte Konformität“ 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 „Bedingte Konformität“?

Lassen Sie generische Typen nur bei erfüllten Einschränkungen konform werden. 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 4 von 4.

Wie lange dauert die Lektion „Bedingte Konformität“?

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

  1. Protokolle als Verträge
  2. Standardimplementierungen in Extensions
  3. Protocol Composition
  4. Bedingte Konformität
← Zurück zu Swift Academy