Swift Academy · Урок

Изменяющие методы и семантика копирования при записи

Узнайте, зачем требуется mutating и как работает оптимизация COW в Swift.

Урок 4 из 412 шагов

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

Добро пожаловать

Методы структур, изменяющие хранимые свойства, должны быть помечены как `mutating`. Swift также использует копирование при записи (COW), чтобы сделать семантику значений эффективной.

Ключевое слово изменения

```swift struct Counter { var count = 0 mutating func increment() { count += 1 } mutating func reset() { count = 0 } } var c = Counter() c.increment() // count = 1 ``` Без `mutating` компилятор отклоняет методы, изменяющие `self`.

Зачем нужен mutating

Структуры являются типами-значениями. Когда Вы передаёте структуру, передаётся *копия*. Компилятору нужно `mutating`, чтобы знать, что метод изменит исходное значение: ```swift let c = Counter() c.increment() // ❌ cannot use mutating on let ```

Переназначение текущего значения в изменяющем методе

Изменяющий метод `mutating` может полностью заменить `self`: ```swift struct Toggle { var isOn: Bool mutating func flip() { self = Toggle(isOn: !isOn) } } ```

Семантика значений: поведение при копировании

```swift var a = Counter() var b = a // b is an independent copy a.increment() print(a.count) // 1 print(b.count) // 0 — unaffected ``` При присваивании структуры копируются все хранимые свойства.

Копирование при записи (COW)

Встроенные коллекции Swift (Array, Dictionary, Set, String) используют COW: ```swift var a = [1,2,3] var b = a // no copy yet — shared storage b.append(4) // NOW a copy is made — a is unchanged print(a) // [1,2,3] print(b) // [1,2,3,4] ```

Зачем нужен COW

Без COW каждое присваивание структуры создавало бы глубокую копию всего содержимого. При использовании COW копирование выполняется дёшево — достаточно увеличить счётчик ссылок, пока изменение не инициирует настоящую копию. Благодаря этому типы-значения в большинстве ситуаций работают так же быстро, как ссылочные типы.

Реализация собственного COW

```swift struct Buffer { private var storage: NSMutableData private mutating func ensureUnique() { if !isKnownUniquelyReferenced(&storage) { storage = storage.mutableCopy() as! NSMutableData } } mutating func append(_ byte: UInt8) { ensureUnique() // safe to mutate storage now } } ```

Изменяющие методы и протоколы

Методы протокола, изменяющие его состояние, должны быть помечены как `mutating` в протоколе: ```swift protocol Resettable { mutating func reset() } struct Counter: Resettable { var count = 0 mutating func reset() { count = 0 } } ``` Классам, реализующим протокол, `mutating` не нужен (классы являются ссылочными типами).

Структуры, сохранённые в константе, полностью неизменяемы

```swift let pt = Point(x: 1, y: 2) pt.x = 3 // ❌ even though x is var inside Point ``` Когда структура сохранена в `let`, ни одно из её хранимых свойств нельзя изменить.

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

Когда именно Copy-on-Write в Swift выполняет копирование?

Итоги

Основные выводы: • `mutating` обозначает методы, изменяющие свойства структуры • Нельзя вызывать изменяющие методы у структур, сохранённых в `let` • При присваивании структура копируется; COW делает это копирование дешёвым для коллекций • COW запускает настоящее копирование только при первом изменении • Реализуйте собственный COW с помощью `isKnownUniquelyReferenced` Курс завершён! Далее: наследование классов.
Можно начать бесплатно

Изучай Swift с ИИ-репетитором — бесплатно

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

Курсы
122
Уроки
409

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

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

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

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

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

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

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

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

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

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

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

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

  1. Инициализаторы со всеми свойствами и пользовательские инициализаторы
  2. Хранимые свойства и наблюдатели свойств
  3. Вычисляемые свойства в структурах
  4. Изменяющие методы и семантика копирования при записи
← Назад к Swift Academy