0Pricing
Swift Academy · Урок

Изменение и переназначение self

Полностью заменяйте self из изменяющего метода.

«Изменение и переназначение self» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Переприсваивание self

Внутри метода mutating можно присвоить self совершенно новое значение, заменив весь экземпляр.

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)

Зачем переприсваивать self

Переприсваивание self удобно, когда новое состояние проще представить как новый экземпляр, чем редактировать поля по одному.

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)

Переприсваивание self в перечислениях

Для перечислений переключение варианта выполняется присваиванием нового варианта переменной 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)

Эквивалентность изменения полей

Присваивание self = Point(x: 1, y: 1) эквивалентно отдельной установке x и y, но записывается короче.

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)

Сначала чтение старого self

Перед переприсваиванием можно вычислить новый экземпляр на основе текущего.

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

Преобразование в стиле построителя

Переприсваивание self позволяет выразить полное преобразование одним шагом.

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

Только в методах mutating

Присваивать self можно только внутри метода, помеченного как mutating. Обычный метод этого делать не может.

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

Сочетание с логикой

Можно использовать ветвление и переприсваивать self только в некоторых случаях.

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)

Шаблон переключения перечисления

Переключение между двумя вариантами перечисления — классический пример переприсваивания self.

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

Другие копии не изменяются

Переприсваивание self изменяет только этот экземпляр. Другие копии значения остаются нетронутыми.

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)

Понятное намерение

Используйте переприсваивание self, когда оно делает преобразование очевидным; если изменяется только одно свойство, редактируйте поле.

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)

Быстрая проверка

Проверьте переприсваивание self.

Итоги

Внутри метода mutating можно присвоить self совершенно новое значение, заменив экземпляр. Это удобно для полных преобразований и используется перечислениями при переключении вариантов. Изменяется только этот экземпляр, а не другие копии.

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

Часто задаваемые вопросы

Урок «Изменение и переназначение self» бесплатный?

Да — полный текст урока «Изменение и переназначение self» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Изменение и переназначение self»?

Полностью заменяйте self из изменяющего метода. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Изменение и переназначение self»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Типы-значения и неизменяемость
  2. Ключевое слово mutating
  3. Изменение и переназначение self
  4. Неизменяющие альтернативы
← Назад к Swift Academy