Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Swift : value, type

Почему структура не может содержать себя напрямую?

Вопрос проверяет понимание модели памяти value types в Swift и того, как компилятор вычисляет размер типа.

Короткий ответ

Структура не может хранить саму себя напрямую, потому что тогда ее размер стал бы бесконечным. Компилятор должен знать размер типа на этапе компиляции, чтобы выделять память. Если внутри структуры лежит такая же структура, то внутри снова лежит такая же структура и так далее. Поэтому прямое самосодержимое запрещено. Разрешается только косвенная ссылка, например через Optional, class или indirect enum.

Длинный ответ

Ограничение связано не с “правилами Swift”, а с тем, как устроена память.

Как компилятор определяет размер структуры

Определение:
Структура (value type) хранится “целиком” и должна иметь конечный, заранее известный размер.

Компилятор вычисляет размер как сумму размеров всех полей (с учетом выравнивания). Это нужно, чтобы:

  • правильно разместить объект в памяти

  • корректно копировать значение

  • работать со стеком и heap предсказуемо

Что будет при самосодержимом поле

Представим невозможный код:

struct Node {
    var next: Node // так нельзя
}

Тогда размер Node равен:

  • размер next = размер Node

  • размер Node = размер Node + ... (бесконечно)

То есть невозможно вычислить конечный размер и выделить память.

Как это решается на практике

Нужно сделать косвенность: чтобы внутри лежал не сам объект, а ссылка/обертка.

Вариант 1: Optional + косвенность через enum

Для списков часто используют indirect enum:

indirect enum List {
    case end
    case node(Int, next: List)
}

indirect говорит хранить рекурсивную часть через ссылку (в heap), поэтому размер становится конечным.

Вариант 2: Ссылочный тип (class)

final class Node {
    var next: Node?
}

Node? — это ссылка, а размер ссылки фиксированный.

Вариант 3: Обертки/указатели (реже)

Например хранить UnsafePointer или контейнер, но это уже низкоуровневая история.

Что важно помнить

  • Value type должен быть конечного размера

  • Рекурсия возможна только через косвенность

  • В Swift “косвенность” чаще всего дают class или indirect enum

Вывод

Структура не может содержать себя напрямую, потому что ее размер стал бы бесконечным и компилятор не смог бы выделить память. Рекурсивные структуры данных строят через косвенные ссылки: class, Optional на ссылочный тип или indirect enum. Это дает конечный размер и предсказуемое размещение в памяти.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Swift

    Swift

Ключевые слова

#value

#type

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.