Swift Academy · Lektion

Begränsningar för typparametrar

Kräv konformans hos generiska parametrar.

Lektion 1 av 413 steg

Begränsningar för typparametrar är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Swift Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Swift Academy innehåller totalt 4 lektioner.

Sammanfattning av generics

En generisk funktion använder en typparameter som <T> för att fungera med många typer. Men ett obegränsat T kan bara skickas vidare, inte undersökas. Begränsningar aktiverar ytterligare funktioner.

func identity<T>(_ x: T) -> T { x }
print(identity(5))
print(identity("hi"))

Begränsningen Comparable

Att skriva <T: Comparable> garanterar att värden av typen T stöder <, > och liknande operatorer, så att Ni kan jämföra dem.

func largest<T: Comparable>(_ a: T, _ b: T) -> T {
    a > b ? a : b
}
print(largest(3, 9))
print(largest("apple", "pear"))

Varför begränsningar behövs

Utan Comparable avvisar kompilatorn a > b, eftersom inte alla typer stöder operatorn. Begränsningen är löftet som gör operationen tillåten.

func minOf<T: Comparable>(_ list: [T]) -> T? {
    list.min()
}
print(minOf([4, 2, 8])!)

Begränsningen Equatable

Equatable aktiverar == och !=. Använd den för att räkna eller hitta matchande element.

func count<T: Equatable>(_ x: T, in list: [T]) -> Int {
    list.filter { $0 == x }.count
}
print(count(2, in: [2, 3, 2, 2]))

Begränsningen Hashable

Hashable gör att Ni kan använda värden som medlemmar i Set eller som nycklar i dictionaries.

func unique<T: Hashable>(_ list: [T]) -> [T] {
    Array(Set(list))
}
print(unique([1, 1, 2, 3, 3]).sorted())

Protokollbegränsningar

Vilket protokoll som helst kan användas som begränsning. Här aktiverar ett anpassat protokoll dess metod för den generiska parametern.

protocol Speaker { func speak() -> String }
struct Dog: Speaker { func speak() -> String { "Woof" } }

func announce<T: Speaker>(_ x: T) {
    print(x.speak())
}
announce(Dog())

Klassbegränsningar

Ni kan kräva att T ärver från en viss klass, vilket ger tillgång till klassens medlemmar.

class Animal { func name() -> String { "animal" } }
class Cat: Animal { override func name() -> String { "cat" } }

func describe<T: Animal>(_ x: T) { print(x.name()) }
describe(Cat())

Flera begränsningar

Kombinera begränsningar med & för att kräva flera protokoll samtidigt.

func show<T: CustomStringConvertible & Equatable>(_ a: T, _ b: T) {
    print(a.description, a == b)
}
show(5, 5)

Flera typparametrar

En funktion kan ha flera begränsade parametrar, var och en med sina egna krav.

func zipMap<K: Hashable, V>(_ keys: [K], _ vals: [V]) -> [K: V] {
    var d: [K: V] = [:]
    for (k, v) in zip(keys, vals) { d[k] = v }
    return d
}
print(zipMap(["a", "b"], [1, 2]))

Begränsningar för typer

Generiska typer, inte bara funktioner, kan också ha begränsningar. En generisk struct kan kräva att dess parameter uppfyller ett protokoll.

struct SortedBox<T: Comparable> {
    var items: [T]
    var smallest: T? { items.min() }
}
print(SortedBox(items: [5, 1, 9]).smallest!)

Numeriska begränsningar

Standardprotokoll som Numeric gör att generisk kod kan utföra aritmetik med Int, Double och fler typer.

func sum<T: Numeric>(_ list: [T]) -> T {
    list.reduce(0, +)
}
print(sum([1, 2, 3]))
print(sum([1.5, 2.5]))

Snabb kontroll

Testa Er förståelse av typparameterbegränsningar.

Sammanfattning

Typparameterbegränsningar (<T: Protocol> eller <T: SomeClass>) talar om för kompilatorn vad en generisk typ kan göra. Ni har sett Comparable, Equatable, Hashable, Numeric, anpassade protokoll, klassbegränsningar, flera begränsningar med & samt begränsningar för generiska typer.

Gratis att börja

Lär dig Swift med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
122
Lektioner
409

Vanliga frågor

Är lektionen ”Begränsningar för typparametrar” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Begränsningar för typparametrar”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Swift Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Begränsningar för typparametrar”?

Kräv konformans hos generiska parametrar. Ni övar på Swift Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Swift Academy?

Du behöver inga förkunskaper. Utbildningen i Swift Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Begränsningar för typparametrar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Swift Academy-lektionen?

Ja. Varje Swift Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Begränsningar för typparametrar
  2. where-satser på funktioner
  3. Begränsa associerade typer
  4. Generiska subscript och extensions
← Tillbaka till Swift Academy