Zugehörige Typen einschränken
Begrenzen Sie zugehörige Typen in generischen Kontexten.
Zugehörige Typen einschränken 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.
Zusammenfassung zu assoziierten Typen
Ein Protokoll kann mit associatedtype einen assoziierten Typ deklarieren, also einen Platzhalter, den ein konformer Typ festlegt. Element in einem Containerprotokoll ist das klassische Beispiel.
protocol Container {
associatedtype Item
var count: Int { get }
func item(at i: Int) -> Item
}Konformität mit einem konkreten Typ
Ein konformer Typ legt den assoziierten Typ fest, der häufig aus seiner Verwendung abgeleitet wird.
protocol Container {
associatedtype Item
func item(at i: Int) -> Item
}
struct IntBox: Container {
let values: [Int]
func item(at i: Int) -> Int { values[i] }
}
print(IntBox(values: [10, 20]).item(at: 1))Den assoziierten Typ einschränken
Fügen Sie die Einschränkung direkt in der Deklaration hinzu: associatedtype Item: Comparable zwingt den Itemtyp jedes konformen Typs dazu, Vergleiche zu unterstützen.
protocol Sorted {
associatedtype Item: Comparable
var items: [Item] { get }
}
struct Nums: Sorted { let items: [Int] }
print(Nums(items: [3, 1, 2]).items.sorted())Die Einschränkung verwenden
Da der assoziierte Typ eingeschränkt ist, können sich Protokollerweiterungen auf diese Fähigkeit verlassen.
protocol Sorted {
associatedtype Item: Comparable
var items: [Item] { get }
}
extension Sorted {
var smallest: Item? { items.min() }
}
struct Nums: Sorted { let items: [Int] }
print(Nums(items: [5, 2, 8]).smallest!)where bei associatedtype
Swift erlaubt auch eine where-Klausel für einen assoziierten Typ, um ihn mit einem anderen assoziierten Typ oder einem verschachtelten Typ zu verknüpfen.
protocol Sequence2 {
associatedtype Element
associatedtype Iterator: IteratorProtocol where Iterator.Element == Element
}Einschränkung auf ein anderes Protokoll
Für einen assoziierten Typ kann verlangt werden, dass er zu einem von Ihnen definierten Protokoll konform ist, sodass sich Verhalten schrittweise aufbauen lässt.
protocol HasName { var name: String { get } }
protocol Registry {
associatedtype Entry: HasName
var entries: [Entry] { get }
}
struct User: HasName { let name: String }
struct Users: Registry { let entries: [User] }
print(Users(entries: [User(name: "Ada")]).entries[0].name)Mehrere assoziierte Typen
Ein Protokoll kann mehrere assoziierte Typen deklarieren, die jeweils unabhängig voneinander eingeschränkt werden.
protocol Mapping {
associatedtype Key: Hashable
associatedtype Value
func value(for k: Key) -> Value?
}
struct Phonebook: Mapping {
let data: [String: Int]
func value(for k: String) -> Int? { data[k] }
}
print(Phonebook(data: ["x": 1]).value(for: "x")!)Standardwert für assoziierten Typ
Sie können einem assoziierten Typ mit = einen Standardwert geben. Dieser wird verwendet, wenn ein konformer Typ keinen anderen Wert festlegt.
protocol Producer {
associatedtype Output = String
func make() -> Output
}
struct Hello: Producer {
func make() -> String { "hi" }
}
print(Hello().make())Einschränkungen ermöglichen generische Algorithmen
Mit einem eingeschränkten assoziierten Typ kann eine Protokollerweiterung echte Algorithmen implementieren, die von allen konformen Typen gemeinsam verwendet werden.
protocol Scored {
associatedtype Score: Comparable
var scores: [Score] { get }
}
extension Scored {
var best: Score? { scores.max() }
}
struct Game: Scored { let scores: [Int] }
print(Game(scores: [10, 40, 25]).best!)Same-Type-Einschränkungen in Erweiterungen
Außerhalb des Protokolls können Sie den assoziierten Typ bei einer Erweiterung des Protokolls weiter einschränken.
protocol Box2 {
associatedtype Content
var content: Content { get }
}
extension Box2 where Content == Int {
var doubled: Int { content * 2 }
}
struct IB: Box2 { let content: Int }
print(IB(content: 7).doubled)Warum einschränken?
Durch die Einschränkung assoziierter Typen bleiben Protokolle generisch und zugleich leistungsfähig: Die Einschränkung ist eine Zusicherung, auf die sich die Erweiterung und ihre Aufrufer verlassen können.
protocol Listy {
associatedtype E: Equatable
var elements: [E] { get }
}
extension Listy {
func has(_ x: E) -> Bool { elements.contains(x) }
}
struct L: Listy { let elements: [String] }
print(L(elements: ["a", "b"]).has("b"))Kurzer Test
Testen Sie Ihr Verständnis der Einschränkung assoziierter Typen.
Zusammenfassung
Sie können assoziierte Typen direkt einschränken (associatedtype Item: Comparable), sie mit where-Klauseln verknüpfen, eine Protokollkonformität verlangen, mit = Standardwerte festlegen, mehrere assoziierte Typen deklarieren und sie in Erweiterungen weiter spezifizieren. Einschränkungen ermöglichen es Protokollerweiterungen, gemeinsame, typsichere Algorithmen zu implementieren.
Häufig gestellte Fragen
Ist die Lektion „Zugehörige Typen einschränken“ kostenlos?
Ja — der vollständige Text von „Zugehörige Typen einschränken“ 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 „Zugehörige Typen einschränken“?
Begrenzen Sie zugehörige Typen in generischen Kontexten. 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 „Zugehörige Typen einschränken“?
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
- Einschränkungen von Typparametern
- where-Klauseln für Funktionen
- Zugehörige Typen einschränken
- Generische Subscripts und Extensions