Generieke subscripts en extensions
Pas beperkingen toe op subscripts en extensions.
Generieke subscripts en extensions is een gratis Swift Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Swift Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Swift Academy bevat in totaal 4 lessen.
Generieke subscripts
Subscripts kunnen generiek zijn en hun eigen typeparameters gebruiken, onafhankelijk van het omringende type. Zo kan één subscript veel invoertypen ondersteunen.
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]])Waarom generieke subscripts
Je kunt dezelfde subscript een Array, een Set of een Range met indexen meegeven, omdat die elke Sequence van Int accepteert.
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]])Beperkte uitbreidingen
Een extension ... where voegt leden toe die alleen bestaan wanneer aan de beperking wordt voldaan. Ze verschijnen alleen op het type bij overeenkomende generieke argumenten.
extension Array where Element: Numeric {
func sumAll() -> Element { reduce(0, +) }
}
print([1, 2, 3].sumAll())
print([1.5, 2.5].sumAll())Uitbreiding voor een specifiek elementtype
Gebruik where Element == String om alleen aan arrays van tekenreeksen hulpfuncties toe te voegen die specifiek zijn voor String.
extension Array where Element == String {
func shout() -> [String] { map { $0.uppercased() + "!" } }
}
print(["hi", "bye"].shout())Beperkte uitbreiding met een protocol
Voeg gedrag toe wanneer elementen aan een aangepast protocol voldoen.
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)Generieke subscript die een optional retourneert
Een subscript kan generiek zijn en een optional retourneren, bijvoorbeeld om veilig in een verzameling te indexeren.
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)Generieke subscript op een woordenboek
Generieke subscripts kunnen een reeks sleutels accepteren en de bijbehorende waarden retourneren.
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())Combineren met where op Self
Uitbreidingen van generieke typen kunnen het ingesloten type beperken, zodat aangepaste API's beschikbaar komen.
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!)Generieke subscript met meerdere parameters
Een subscript kan tegelijk meerdere argumenten en eigen typeparameters accepteren.
struct Grid {
let rows = [[1, 2], [3, 4]]
subscript(_ r: Int, _ c: Int) -> Int { rows[r][c] }
}
print(Grid()[1, 0])Alleen lezen versus lezen en schrijven
Net als eigenschappen kunnen subscripts alleen een get hebben, of zowel get als set voor wijzigingen.
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 samenbrengen
Met generieke subscripts en beperkte uitbreidingen kun je expressieve, typesafe API's bouwen die zich aanpassen aan de gebruikte element- of argumenttypen.
extension Array where Element: Comparable {
subscript(topAfterSort i: Int) -> Element { sorted()[i] }
}
print([5, 1, 9, 3][topAfterSort: 0])Korte controle
Test je begrip van generieke subscripts en beperkte uitbreidingen.
Samenvatting
Generieke subscripts declareren hun eigen typeparameters en where-clausules, zodat één subscript veel invoertypen kan accepteren. Beperkte uitbreidingen (where Element: ... of == ...) voegen alleen leden toe wanneer aan de voorwaarden wordt voldaan. Samen vormen ze typesafe, aanpasbare API's.
Leer Swift met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 122
- Lessen
- 409
Veelgestelde vragen
Is de les “Generieke subscripts en extensions” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Swift Academy, waaronder “Generieke subscripts en extensions”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Swift Academy bevat in totaal 4 lessen.
Wat leer ik in “Generieke subscripts en extensions”?
Pas beperkingen toe op subscripts en extensions. Je oefent met Swift Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Swift Academy te beginnen?
Ervaring vooraf is niet nodig. Swift Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Generieke subscripts en extensions”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Swift Academy?
Ja. Elke les over Swift Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Beperkingen voor typeparameters
- where-clausules voor functies
- Geassocieerde typen beperken
- Generieke subscripts en extensions