Структуры в Swift являются типами значений (value types). При создании экземпляра структуры выделяется память под все ее поля. Если бы структура могла содержать поле с типом самой себя, размер этой структуры был бы бесконечным, поскольку внутри нее требовалось бы место для еще одного экземпляра той же структуры, в котором, в свою очередь, требовалось бы место для еще одного и так далее. Это привело бы к циклической зависимости и невозможности определить конечный размер структуры.
В отличие от структур, классы являются ссылочными типами (reference types). Поле класса может хранить ссылку на экземпляр этого же класса. Поскольку поле хранит только адрес в памяти, занимаемый экземпляром класса, а не сам экземпляр полностью, нет необходимости знать полный размер целевого экземпляра при определении размера класса. Ссылки имеют фиксированный размер.
Пример, иллюстрирующий проблему со структурами:
swift
Для решения подобных задач с использованием структур можно использовать косвенные ссылки, например, через протокол или замыкания, или же использовать классы. Типичный пример - связные списки, которые обычно реализуются с помощью классов.