Структура Objective-C - это структура C, а структура C - это просто блок памяти со смещениями, определяемыми свойствами структуры. Итак, если структура имеет три int
свойства, x, y, z, мы знаем, что x это просто псевдоним для «начала структуры», y это просто псевдоним для «такого количества байтов после начала структура ", а z это просто псевдоним для" некоторого другого числа байтов после начала структуры ". Структура C может храниться в стеке, если это локальная (автоматическая) переменная, или может храниться в куче, вызывая malloc
и используя указатель структуры для ссылки на эту память. Структура C - это очень примитивный тип. И снова, ObjC-структуры - это просто C-структуры. Там нет разницы. (Фактически, именно поэтому вы не можете поместить объекты, управляемые ARC, в структуру ; они всего лишь структуры C, и ARC не может справиться с этим.)
Структуры Свифта - совершенно другое животное. Как правило, они по-прежнему реализуются в виде блока памяти, либо в стеке, либо в куче, свойства которой смещаются в блок памяти, но это в основном просто детали реализации. Структуры Swift - это расширенные типы, которые могут иметь методы, расширения, соответствовать протоколам и большинству других вещей, которые можно ожидать от расширенного типа в языке с расширенным набором типов.
Самое главное, структуры Swift - это не просто «каламбуры памяти», подобные структурам C. Вы можете указывать разные структуры C на одну и ту же память и читать ее по-разному (конечно, профсоюзы могут делать это, но вы также можете просто делать это непосредственно со структурами). Нет правила, что базовый блок памяти будет того же размера, что и структура в C (так работает, например, objc_object). Но структуры Swift не допускают такого наложения памяти. Они «владеют» своей памятью гораздо более напрямую. Если вы хотите возиться со своей внутренней памятью, вам придется пройти через какой-то «небезопасный» интерфейс. Вы не можете просто добавить 4 к указателю и получить любое значение, например, структуру C.
Из-за всего этого вы можете хранить управляемые ARC объекты в структуре Swift (и на самом деле это все время выполняется в stdlib.)
Так что да, совершенно разные твари, несмотря на то, что у них одно и то же имя. Единственное, что действительно одинаково, - это то, что оба они имеют типы значений со свойствами.