Swift Academy · Lezione

Mutating e riassegnazione di self

Sostituisci interamente self da un metodo mutating.

Lezione 3 di 413 passaggi

Mutating e riassegnazione di self è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Riassegnare self

All'interno di un metodo mutating è possibile assegnare un valore completamente nuovo a self, sostituendo l'intera istanza.

struct Point {
    var x = 0
    var y = 0
    mutating func reset() {
        self = Point(x: 0, y: 0)
    }
}
var p = Point(x: 3, y: 4)
p.reset()
print(p.x, p.y)

Perché riassegnare self

Riassegnare self è utile quando il nuovo stato si esprime più facilmente come una nuova istanza, invece di modificare i campi uno alla volta.

struct Vector {
    var dx: Int
    var dy: Int
    mutating func negate() {
        self = Vector(dx: -dx, dy: -dy)
    }
}
var v = Vector(dx: 2, dy: -3)
v.negate()
print(v.dx, v.dy)

Gli enum riassegnano self

Per gli enum, il cambio di caso si esegue assegnando un nuovo caso a self.

enum State {
    case idle, running, done
    mutating func advance() {
        switch self {
        case .idle: self = .running
        case .running: self = .done
        case .done: self = .done
        }
    }
}
var s = State.idle
s.advance()
s.advance()
print(s)

Equivalente alla modifica dei campi

Assegnare self = Point(x: 1, y: 1) equivale a impostare x e y individualmente, ma in modo più conciso.

struct Point {
    var x = 0
    var y = 0
    mutating func setBoth(_ n: Int) {
        self = Point(x: n, y: n)
    }
}
var p = Point()
p.setBoth(7)
print(p.x, p.y)

Leggere prima il vecchio self

È possibile calcolare la nuova istanza a partire da quella corrente prima di riassegnarla.

struct Counter {
    var value: Int
    mutating func doubled() {
        self = Counter(value: value * 2)
    }
}
var c = Counter(value: 5)
c.doubled()
print(c.value)

Trasformazione in stile builder

La riassegnazione di self consente a un metodo di esprimere una trasformazione completa in un solo passaggio.

struct Temperature {
    var celsius: Double
    mutating func toRounded() {
        self = Temperature(celsius: celsius.rounded())
    }
}
var t = Temperature(celsius: 21.7)
t.toRounded()
print(t.celsius)

Solo nei metodi mutating

È possibile assegnare a self soltanto all'interno di un metodo contrassegnato con mutating. Un metodo normale non può farlo.

struct Flag {
    var on = false
    mutating func turnOn() {
        self = Flag(on: true)
    }
}
var f = Flag()
f.turnOn()
print(f.on)

Combinare con la logica

È possibile usare condizioni e riassegnare self solo in alcuni casi.

struct Score {
    var points: Int
    mutating func clamp() {
        if points > 100 {
            self = Score(points: 100)
        }
    }
}
var s = Score(points: 150)
s.clamp()
print(s.points)

Pattern di toggle di un enum

Un enum con due casi e un toggle è un esempio classico di riassegnazione di self.

enum Switch {
    case off, on
    mutating func flip() {
        self = (self == .off) ? .on : .off
    }
}
var sw = Switch.off
sw.flip()
print(sw)

Nessun effetto sulle altre copie

Riassegnare self modifica solo questa istanza. Le altre copie del valore restano inalterate.

struct Box { var n: Int; mutating func zero() { self = Box(n: 0) } }
var a = Box(n: 5)
var b = a
a.zero()
print(a.n, b.n)

Intento leggibile

Usi la riassegnazione di self quando rende evidente la trasformazione; usi la modifica dei campi quando cambia una sola proprietà.

struct Pair {
    var a: Int
    var b: Int
    mutating func swapValues() {
        self = Pair(a: b, b: a)
    }
}
var p = Pair(a: 1, b: 2)
p.swapValues()
print(p.a, p.b)

Verifica rapida

Verifichi la riassegnazione di self.

Riepilogo

All'interno di un metodo mutating è possibile assegnare un valore completamente nuovo a self, sostituendo l'istanza. Questa tecnica è concisa per le trasformazioni complete ed è il modo in cui gli enum cambiano caso. Modifica solo questa istanza, non le altre copie.

enum T { case a, b; mutating func go() { self = .b } }
var t = T.a
t.go()
print(t)
Gratis per iniziare

Impara Swift con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
122
Lezioni
409

Domande Frequenti

La lezione «Mutating e riassegnazione di self» è gratuita?

Sì — il testo completo di «Mutating e riassegnazione di self» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Mutating e riassegnazione di self»?

Sostituisci interamente self da un metodo mutating. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Mutating e riassegnazione di self»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Tipi valore e immutabilità
  2. La parola chiave mutating
  3. Mutating e riassegnazione di self
  4. Alternative non mutating
← Torna a Swift Academy