0Pricing
Swift Academy · Урок

Неизменяющие альтернативы

Возвращайте новые значения вместо изменения существующих на месте.

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

Возврат вместо изменения

Вместо изменения экземпляра на месте метод без изменения может вернуть новое значение с применённым изменением.

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)

Исходное значение не изменяется

Поскольку ничего не изменяется, исходное значение сохраняется, а создаётся новое.

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)

Работа с экземплярами let

Методы без изменения можно вызывать для констант let, поскольку они не изменяют получатель.

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)

Соглашение об именовании

Соглашение Swift: методы с изменением используют повелительные глаголы (sort), а методы без изменения — формы причастия прошедшего времени или формы с окончаниями -ed/-ing (sorted).

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

sorted и sort

Стандартная библиотека следует этому соглашению: sorted() возвращает новый массив, а sort() изменяет массив на месте.

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

reversed и reverse

Аналогично, reversed() не изменяет исходное значение. Здесь мы материализуем результат с помощью Array.

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

Объединение вызовов без изменения

Методы без изменения возвращают значения, поэтому их можно удобно объединять в цепочки.

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

Функциональный стиль

Возврат новых значений вместо изменения поддерживает функциональный стиль, который легко тестировать и анализировать.

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)

Предотвращение ошибок общего состояния

Создание новых значений предотвращает случайные общие изменения, что особенно важно при работе между потоками.

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)

Когда лучше использовать изменение

Если в цикле требуется многократно обновлять один экземпляр, изменение на месте может быть эффективнее создания множества копий.

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

Предлагайте оба варианта

Хорошо спроектированные типы иногда предлагают оба варианта, как стандартная библиотека, чтобы вызывающая сторона могла выбрать изменение или создание нового значения.

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)

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

Проверьте проектирование без изменения.

Итоги

В качестве альтернативы изменению метод без изменения возвращает новое значение с применённым изменением, оставляет исходное без изменений и работает с экземплярами let. В Swift повелительным именам (sort) соответствуют имена с окончаниями -ed/-ing (sorted).

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

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

Урок «Неизменяющие альтернативы» бесплатный?

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

Чему я научусь в уроке «Неизменяющие альтернативы»?

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

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

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

Сколько времени занимает урок «Неизменяющие альтернативы»?

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

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

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

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

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