Swift Academy · leksjon

Alternativer uten mutering

Returner nye verdier i stedet for å endre verdier på stedet.

Leksjon 4 av 413 trinn

Alternativer uten mutering 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.

Returnere i stedet for å mutere

I stedet for å endre en instans direkte kan en ikke-muterende metode returnere en helt ny verdi med endringen utført.

struct Counter {
    var value: Int
    func incremented() -> Counter {
        return Counter(value: value + 1)
    }
}
let c = Counter(value: 0)
let next = c.incremented()
print(c.value, next.value)

Originalen forblir uendret

Fordi ingenting muteres, bevares den opprinnelige verdien, samtidig som en ny verdi opprettes.

struct Vector {
    var x: Int
    var y: Int
    func scaled(by factor: Int) -> Vector {
        return Vector(x: x * factor, y: y * factor)
    }
}
let v = Vector(x: 2, y: 3)
let big = v.scaled(by: 10)
print(v.x, v.y, big.x, big.y)

Fungerer på let-instanser

Ikke-muterende metoder kan kalles på let-konstanter, siden de ikke endrer mottakeren.

struct Money {
    var cents: Int
    func plus(_ other: Int) -> Money {
        return Money(cents: cents + other)
    }
}
let m = Money(cents: 100)
print(m.plus(50).cents)

Navnekonvensjon

Swift-konvensjonen er at muterende metoder bruker imperativ (sort), mens ikke-muterende metoder bruker perfektum partisipp eller former på -ed/-ing (sorted).

var nums = [3, 1, 2]
let ordered = nums.sorted()
nums.sort()
print(ordered, nums)

sorted kontra sort

Standardbiblioteket følger denne konvensjonen: sorted() returnerer en ny array, mens sort() muterer arrayen direkte.

let a = [5, 2, 8, 1]
let b = a.sorted()
print(a)
print(b)

reversed kontra reverse

Tilsvarende er reversed() ikke-muterende. Her materialiseres resultatet med Array.

let a = [1, 2, 3]
let b = Array(a.reversed())
print(a, b)

Kjeding av ikke-muterende kall

Ikke-muterende metoder returnerer verdier, slik at kallene kan kjedes på en flytende måte.

let result = [4, 2, 9, 1].sorted().map { $0 * 2 }
print(result)

Funksjonell stil

Å returnere nye verdier i stedet for å mutere støtter en funksjonell stil som er enkel å teste og resonnere over.

struct Account {
    var balance: Int
    func deposited(_ n: Int) -> Account {
        return Account(balance: balance + n)
    }
}
let a0 = Account(balance: 0)
let a1 = a0.deposited(100).deposited(50)
print(a0.balance, a1.balance)

Unngå feil med delt tilstand

Å produsere nye verdier unngår utilsiktede delte muteringer, noe som er spesielt verdifullt på tvers av tråder.

struct Settings {
    var volume: Int
    func with(volume newVolume: Int) -> Settings {
        return Settings(volume: newVolume)
    }
}
let base = Settings(volume: 5)
let loud = base.with(volume: 11)
print(base.volume, loud.volume)

Når mutering er et bedre valg

Hvis én instans oppdateres gjentatte ganger i en løkke, kan mutering direkte være mer effektivt enn å opprette mange kopier.

var total = 0
for n in 1...5 {
    total += n
}
print(total)

Tilby begge deler

Godt utformede typer tilbyr noen ganger begge formene, slik standardbiblioteket gjør, slik at den som kaller metoden, kan velge mellom mutering og en ny verdi.

struct Text {
    var value: String
    func uppercased() -> Text {
        return Text(value: value.uppercased())
    }
    mutating func uppercase() {
        value = value.uppercased()
    }
}
var t = Text(value: "hi")
let u = t.uppercased()
t.uppercase()
print(u.value, t.value)

Hurtigsjekk

Test design uten mutering.

Oppsummering

Som et alternativ til mutering kan en ikke-muterende metode returnere en ny verdi med endringen utført, samtidig som originalen forblir intakt og metoden kan brukes på let-instanser. Swift-konvensjonen kobler imperativnavn (sort) med navn på -ed/-ing (sorted).

let a = [3, 1, 2]
let b = a.sorted()
print(a, b)
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 «Alternativer uten mutering» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Swift Academy, inkludert «Alternativer uten mutering», 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 «Alternativer uten mutering»?

Returner nye verdier i stedet for å endre verdier på stedet. 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 «Alternativer uten mutering»?

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. Verdityper og uforanderlighet
  2. Nøkkelordet mutating
  3. Mutating og tilordning av self på nytt
  4. Alternativer uten mutering
← Tilbake til Swift Academy