Swift Academy · Lektion

Icke-muterande alternativ

Returnera nya värden i stället för att mutera på plats.

Lektion 4 av 413 steg

Icke-muterande alternativ är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 4 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.

Returnera i stället för att mutera

I stället för att ändra en instans på plats kan en metod utan mutering returnera ett helt nytt värde där ändringen redan har tillämpats.

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)

Originalet förblir oförändrat

Eftersom inget muteras bevaras originalvärdet och ett nytt värde skapas.

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)

Fungerar på let-instanser

Metoder utan mutering kan anropas på let-konstanter, eftersom de inte ändrar mottagaren.

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)

Namngivningskonvention

Swift-konventionen är att mutating-metoder använder imperativa verb (sort), medan metoder utan mutering använder perfektparticip eller -ed/-ing-former (sorted).

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

sorted jämfört med sort

Standardbiblioteket följer denna konvention: sorted() returnerar en ny array, medan sort() muterar arrayen på plats.

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

reversed jämfört med reverse

På samma sätt muterar reversed() inte. Här materialiserar vi resultatet med Array.

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

Kedja anrop utan mutering

Metoder utan mutering returnerar värden, så du kan kedja dem på ett smidigt sätt.

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

Funktionell stil

Att returnera nya värden i stället för att mutera stöder en funktionell stil som är enkel att testa och resonera kring.

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)

Undvik fel med delat tillstånd

Genom att skapa nya värden undviker du oavsiktliga ändringar av delat tillstånd, vilket är särskilt värdefullt mellan trådar.

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 du bör mutera i stället

Om du uppdaterar samma instans upprepade gånger i en loop kan mutering på plats vara effektivare än att skapa många kopior.

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

Erbjud båda formerna

Väldesignade typer erbjuder ibland båda formerna, precis som standardbiblioteket, så att anroparen kan välja mellan mutering och ett nytt värde.

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)

Snabbtest

Testa design utan mutering.

Sammanfattning

Som alternativ till mutering returnerar en metod utan mutering ett nytt värde där ändringen har tillämpats, medan originalet förblir intakt och metoden kan användas på let-instanser. Swift-konventionen parar ihop imperativa namn (sort) med -ed/-ing-namn (sorted).

let a = [3, 1, 2]
let b = a.sorted()
print(a, b)
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 ”Icke-muterande alternativ” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Icke-muterande alternativ”, 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 ”Icke-muterande alternativ”?

Returnera nya värden i stället för att mutera på plats. 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 4 av 4.

Hur lång tid tar lektionen ”Icke-muterande alternativ”?

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. Värdetyper och oföränderlighet
  2. Nyckelordet mutating
  3. Mutating och omtilldelning av self
  4. Icke-muterande alternativ
← Tillbaka till Swift Academy