Alternativer uten mutering
Returner nye verdier i stedet for å endre verdier på stedet.
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)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
- Verdityper og uforanderlighet
- Nøkkelordet mutating
- Mutating og tilordning av self på nytt
- Alternativer uten mutering