0Pricing
Swift Academy · Урок

Смешанные графы значений и ссылок

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

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

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

Структуры могут содержать классы в качестве хранимых свойств. В таком случае снаружи структура ведёт себя как тип-значение, но внутри совместно использует ссылку на класс — это может привести к незаметной ошибке.

Структура, содержащая класс

```swift class Storage { var data: [Int] = [] } struct Container { var storage = Storage() var label: String = "" } var a = Container() var b = a // copies label, but SHARES storage! a.storage.data.append(1) print(b.storage.data) // [1] — shared! ```

Копируются только свойства-значения

При копировании структуры: • Свойства типов-значений (`label: String`) копируются полностью • Для свойств ссылочных типов (`storage: Storage`) копируется только указатель Это называется *поверхностной копией*.

Создание глубокой копии

```swift struct Container { var storage: Storage func deepCopy() -> Container { let newStorage = Storage() newStorage.data = storage.data // copy values return Container(storage: newStorage, label: label) } } ```

На помощь приходит COW

Коллекции Swift избегают этой проблемы с помощью COW: ```swift struct SafeContainer { private(set) var storage = Storage() mutating func append(_ n: Int) { if !isKnownUniquelyReferenced(&storage) { storage = storage.copy() // copy before mutating } storage.data.append(n) } } ```

Классы, содержащие структуры

```swift class ViewModel { var point = CGPoint(x: 0, y: 0) // value type inside reference type } let vm1 = ViewModel() let vm2 = vm1 // same ViewModel! vm1.point.x = 5 print(vm2.point.x) // 5 — shared because ViewModel is a class ```

Идентичность и равенство

```swift class Dog { var name: String = "" } let x = Dog() let y = x print(x === y) // true — same object print(x !== y) // false let z = Dog() print(x === z) // false — different objects ```

Рекурсивная структура через класс

Структуры не могут ссылаться на самих себя, но могут содержать класс, который ссылается на структуру: ```swift struct Tree { var value: Int var children: [Tree] // OK — Array uses class internally } ```

Обнаружение неожиданного совместного использования

Используйте `isKnownUniquelyReferenced` во время выполнения, чтобы обнаружить совместное использование: ```swift var s = Storage() var r: AnyObject = s print(isKnownUniquelyReferenced(&s)) // true var s2 = s print(isKnownUniquelyReferenced(&s)) // false — shared ```

Рекомендации по проектированию

Если структура должна содержать изменяемое состояние ссылочного типа: 1. Реализуйте COW, чтобы вернуть семантику значений 2. Либо используйте неизменяемый класс: `let` вместо `var` для свойства класса 3. Либо измените проектирование — возможно, структура должна быть классом Чётко документируйте случаи, когда совместное использование является преднамеренным.

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

Что происходит с классом, когда Вы копируете структуру, содержащую свойство класса?

Итоги

Главное: • Копия структуры является поверхностной — ссылки на классы совместно используются • `isKnownUniquelyReferenced` обнаруживает совместное использование во время выполнения • Реализуйте COW, чтобы вернуть настоящую семантику значений • `===` / `!==` проверяют идентичность объектов классов • В рекурсивных структурах для дочерних элементов используется Array, основанный на классе Далее: проектирование интерфейсов с семантикой значений.

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

Урок «Смешанные графы значений и ссылок» бесплатный?

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

Чему я научусь в уроке «Смешанные графы значений и ссылок»?

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

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

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

Сколько времени занимает урок «Смешанные графы значений и ссылок»?

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

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

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

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

  1. Стек и куча: где хранятся значения
  2. Изменение, совместное использование и неожиданное псевдонимирование
  3. Смешанные графы значений и ссылок
  4. Проектирование интерфейсов с семантикой значений
← Назад к Swift Academy