Swift Academy · leksjon

Generiske subskripter og extensions

Bruk begrensninger på subskripter og extensions.

Leksjon 4 av 413 trinn

Generiske subskripter og extensions er en gratis leksjon i Swift Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Swift Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Swift Academy inneholder totalt 4 leksjoner.

Generiske subskripter

Subskripter kan være generiske og ha egne typeparametere som er uavhengige av den omsluttende typen. Dermed kan ett subskript betjene mange inndatatyper.

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]])

Hvorfor generiske subskripter

De kan sende en Array, en Set eller en Range med indekser til det samme subskriptet fordi det godtar enhver Sequence av Int.

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]])

Begrensede utvidelser

En extension ... where legger til medlemmer som bare finnes når begrensningen er oppfylt. De vises på typen bare for samsvarende generiske argumenter.

extension Array where Element: Numeric {
    func sumAll() -> Element { reduce(0, +) }
}
print([1, 2, 3].sumAll())
print([1.5, 2.5].sumAll())

Utvidelse for en bestemt elementtype

Bruk where Element == String for å legge til hjelpefunksjoner som er spesifikke for String, bare i arrayer med strenger.

extension Array where Element == String {
    func shout() -> [String] { map { $0.uppercased() + "!" } }
}
print(["hi", "bye"].shout())

Begrenset utvidelse med protokoll

Legg til funksjonalitet når elementene samsvarer med en egendefinert protokoll.

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)

Generisk subskript som returnerer Optional

Et subskript kan være generisk og returnere en optional, for eksempel ved trygg indeksering i en samling.

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)

Generisk subskript på Dictionary

Generiske subskripter kan godta en sekvens med nøkler og returnere de samsvarende verdiene.

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())

Kombinere med where på Self

Utvidelser på generiske typer kan begrense den innpakkede typen og dermed eksponere tilpassede API-er.

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!)

Generisk subskript med flere parametere

Et subskript kan ta flere argumenter og sine egne typeparametere samtidig.

struct Grid {
    let rows = [[1, 2], [3, 4]]
    subscript(_ r: Int, _ c: Int) -> Int { rows[r][c] }
}
print(Grid()[1, 0])

Skrivebeskyttet kontra lese- og skrivbar

I likhet med egenskaper kan subskripter ha bare get, eller både get og set for endring.

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)

Sette det hele sammen

Generiske subskripter og begrensede utvidelser gjør det mulig å bygge uttrykksfulle, typesikre API-er som tilpasser seg element- eller argumenttypene som brukes.

extension Array where Element: Comparable {
    subscript(topAfterSort i: Int) -> Element { sorted()[i] }
}
print([5, 1, 9, 3][topAfterSort: 0])

Sjekk forståelsen

Test forståelsen av generiske subskripter og begrensede utvidelser.

Oppsummering

Generiske subskripter deklarerer egne typeparametere og where-klausuler, slik at ett subskript kan godta mange inndatatyper. Begrensede utvidelser (where Element: ... eller == ...) legger bare til medlemmer når betingelsene er oppfylt. Sammen danner de typesikre og tilpasningsdyktige API-er.

Gratis å komme i gang

Lær deg Swift med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
122
Leksjoner
409

Ofte stilte spørsmål

Er leksjonen «Generiske subskripter og extensions» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Swift Academy, inkludert «Generiske subskripter og extensions», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Swift Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Generiske subskripter og extensions»?

Bruk begrensninger på subskripter og extensions. Du øver på Swift Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Swift Academy?

Ingen tidligere erfaring er nødvendig. Swift Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Generiske subskripter og extensions»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Swift Academy-leksjonen?

Ja. Alle Swift Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Begrensninger for typeparametere
  2. where-klausuler på funksjoner
  3. Begrense assosierte typer
  4. Generiske subskripter og extensions
← Tilbake til Swift Academy