Выбор ответа Middle Типы значений и ссылочные обновлено
Зачем indirect у enum
Вопрос
Почему без indirect не компилируется enum Node { case leaf(Int); case pair(Node, Node) }?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Рекурсивное значение имело бы бесконечный размер; indirect даёт бокс. Размер типа значения известен при компиляции.
Варианты ответа
- Enum не может иметь связанных значений разных типов в разных кейсах
- Рекурсивное значение имело бы бесконечный размер;
indirectдаёт боксправильный ответ indirectделает enum ссылочным типом с идентичностью, как класс- Нужно явно указать raw value типа
Int, иначе рекурсия запрещена
Разбор
Размер типа значения известен при компиляции. Если Node содержит Node напрямую, размер бесконечен. indirect упаковывает связанное значение в бокс в куче, а снаружи enum остаётся типом значения без идентичности. Raw values и связанные значения разных типов здесь ни при чём.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Оператор === в Swift
Следующий вопрос
Задача на Swift: стек отмены для текстового поля
Ещё по теме «Типы значений и ссылочные»
- Copy-on-write у Array: когда копируется буфер
- Модификаторы borrowing и consuming
- Как сделать свой copy-on-write
- Existential container: как хранится any Protocol
- Типы значений и ссылочные типы в Swift
- let и экземпляр класса: можно ли менять свойства
- Типы Swift: значение или ссылка
- Когда пропадает memberwise-инициализатор структуры