Generische Subscripts und Extensions
Wenden Sie Einschränkungen auf Subscripts und Extensions an.
Generische Subscripts und Extensions 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.
Generische Subscripts
Subscripts können generisch sein und eigene, vom umgebenden Typ unabhängige Typparameter verwenden. Dadurch kann ein einzelnes Subscript viele Eingabetypen bedienen.
struct Lookup {
let data = [1, 2, 3, 4, 5]
subscript<S: Sequence>(indices idx: S) -> [Int] where S.Element == Int {
idx.map { data[$0] }
}
}
print(Lookup()[indices: [0, 2, 4]])Warum generische Subscripts?
Sie können ein Array, ein Set oder einen Range von Indizes an dasselbe Subscript übergeben, weil es jede Sequence aus Int akzeptiert.
struct Lookup {
let data = [10, 20, 30, 40]
subscript<S: Sequence>(_ idx: S) -> [Int] where S.Element == Int {
idx.map { data[$0] }
}
}
let l = Lookup()
print(l[0...1])
print(l[[3, 0]])Erweiterungen mit Einschränkungen
Ein extension ... where fügt Member hinzu, die nur existieren, wenn die Einschränkung erfüllt ist. Sie erscheinen beim Typ nur für passende generische Argumente.
extension Array where Element: Numeric {
func sumAll() -> Element { reduce(0, +) }
}
print([1, 2, 3].sumAll())
print([1.5, 2.5].sumAll())Erweiterung für einen bestimmten Elementtyp
Verwenden Sie where Element == String, um nur für String-Arrays String-spezifische Hilfsfunktionen hinzuzufügen.
extension Array where Element == String {
func shout() -> [String] { map { $0.uppercased() + "!" } }
}
print(["hi", "bye"].shout())Erweiterung mit Protokolleinschränkung
Fügen Sie Verhalten hinzu, wenn die Elemente zu einem benutzerdefinierten Protokoll konform sind.
protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }
extension Collection where Element: Priced {
var total: Double { reduce(0) { $0 + $1.price } }
}
print([Item(price: 2), Item(price: 3)].total)Generisches Subscript mit optionalem Rückgabewert
Ein Subscript kann generisch sein und einen optionalen Wert zurückgeben, beispielsweise für eine sichere Indizierung in einer Collection.
extension Array {
subscript(safe i: Int) -> Element? {
indices.contains(i) ? self[i] : nil
}
}
print([1, 2, 3][safe: 1] ?? -1)
print([1, 2, 3][safe: 9] ?? -1)Generisches Subscript für Dictionary
Generische Subscripts können eine Sequenz von Schlüsseln akzeptieren und die zugehörigen Werte zurückgeben.
extension Dictionary {
subscript<S: Sequence>(keys ks: S) -> [Value] where S.Element == Key {
ks.compactMap { self[$0] }
}
}
let d = ["a": 1, "b": 2, "c": 3]
print(d[keys: ["a", "c"]].sorted())Kombination mit where für Self
Erweiterungen generischer Typen können den umschlossenen Typ einschränken und dadurch maßgeschneiderte APIs bereitstellen.
struct Stack<T> { var items: [T] = [] }
extension Stack where T: Comparable {
var peakMax: T? { items.max() }
}
var s = Stack<Int>(); s.items = [3, 9, 1]
print(s.peakMax!)Generisches Subscript mit mehreren Parametern
Ein Subscript kann mehrere Argumente und gleichzeitig eigene Typparameter entgegennehmen.
struct Grid {
let rows = [[1, 2], [3, 4]]
subscript(_ r: Int, _ c: Int) -> Int { rows[r][c] }
}
print(Grid()[1, 0])Nur Lesen vs. Lesen und Schreiben
Wie Eigenschaften können Subscripts nur einen get-Zugriff oder sowohl get als auch set für Änderungen besitzen.
struct Pad {
var values = [0, 0, 0]
subscript(i: Int) -> Int {
get { values[i] }
set { values[i] = newValue }
}
}
var p = Pad(); p[1] = 7
print(p.values)Alles zusammenführen
Generische Subscripts und Erweiterungen mit Einschränkungen ermöglichen ausdrucksstarke, typsichere APIs, die sich an die jeweils verwendeten Element- oder Argumenttypen anpassen.
extension Array where Element: Comparable {
subscript(topAfterSort i: Int) -> Element { sorted()[i] }
}
print([5, 1, 9, 3][topAfterSort: 0])Kurzer Test
Testen Sie Ihr Verständnis generischer Subscripts und von Erweiterungen mit Einschränkungen.
Zusammenfassung
Generische Subscripts deklarieren eigene Typparameter und where-Klauseln, sodass ein Subscript viele Eingabetypen akzeptieren kann. Erweiterungen mit Einschränkungen (where Element: ... oder == ...) fügen Member nur hinzu, wenn die Bedingungen erfüllt sind. Zusammen ermöglichen sie typsichere und anpassungsfähige APIs.
Häufig gestellte Fragen
Ist die Lektion „Generische Subscripts und Extensions“ kostenlos?
Ja — der vollständige Text von „Generische Subscripts und Extensions“ 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 „Generische Subscripts und Extensions“?
Wenden Sie Einschränkungen auf Subscripts und Extensions an. 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 „Generische Subscripts und Extensions“?
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