0Pricing
Swift Academy · Lekcja

mutating i ponowne przypisanie self

Całkowite zastępowanie self w metodzie mutating.

mutating i ponowne przypisanie self to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Ponowne przypisywanie self

Wewnątrz metody mutating można przypisać do self zupełnie nową wartość, zastępując całą instancję.

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)

Dlaczego przypisywać ponownie self

Ponowne przypisanie self jest przydatne, gdy nowy stan łatwiej wyrazić jako nową instancję niż edytować kolejno poszczególne pola.

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)

Enumy przypisują ponownie self

W przypadku enumów zmianę przypadku wykonuje się przez przypisanie nowego przypadku do 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)

Równoważność z edycją pól

Przypisanie self = Point(x: 1, y: 1) jest równoważne indywidualnemu ustawieniu x i y, ale bardziej zwięzłe.

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)

Najpierw odczytaj stare self

Przed ponownym przypisaniem można obliczyć nową instancję na podstawie bieżącej.

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

Transformacja w stylu buildera

Ponowne przypisanie self pozwala wyrazić w jednej operacji pełną transformację wykonywaną przez metodę.

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

Tylko w metodach mutating

Do self można przypisywać wyłącznie wewnątrz metody oznaczonej jako mutating. Zwykła metoda nie może tego robić.

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

Łączenie z logiką

Można rozgałęziać logikę i przypisywać ponownie do self tylko w niektórych przypadkach.

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)

Wzorzec przełączania enuma

Przełączanie enuma dwuwariantowego to klasyczny przykład ponownego przypisywania self.

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

Brak wpływu na inne kopie

Ponowne przypisanie self zmienia tylko tę instancję. Inne kopie wartości pozostają nietknięte.

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)

Czytelna intencja

Ponownego przypisania self należy używać, gdy jasno pokazuje ono transformację; edycji pól należy użyć, gdy zmienia się tylko jedna właściwość.

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)

Szybkie sprawdzenie

Sprawdź ponowne przypisywanie self.

Podsumowanie

Wewnątrz metody mutating można przypisać do self zupełnie nową wartość, zastępując instancję. Jest to zwięzłe rozwiązanie dla pełnych transformacji i sposób, w jaki enumy przełączają przypadki. Wpływa tylko na tę instancję, a nie na inne kopie.

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

Często zadawane pytania

Czy lekcja „mutating i ponowne przypisanie self” jest bezpłatna?

Tak — pełny tekst „mutating i ponowne przypisanie self” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „mutating i ponowne przypisanie self”?

Całkowite zastępowanie self w metodzie mutating. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „mutating i ponowne przypisanie self”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Typy wartości i niezmienność
  2. Słowo kluczowe mutating
  3. mutating i ponowne przypisanie self
  4. Alternatywy dla mutating
← Powrót do Swift Academy