Почему среда исполнения Swift не может поместить сохраненные свойства в существующую структуру для расширений? - PullRequest
0 голосов
/ 18 января 2019

Расширения Swift не могут содержать сохраненные свойства:

Поскольку свойства требуют хранения, добавление свойств изменит структура памяти класса

Если мы внимательно посмотрим на структуру класса времени выполнения, список Ivar содержит хранилище свойств, а список методов также содержит сведения о методах, которые вызывают объекты класса. И расширения добавляют функции в виде методов к классам. extraSpace в структуре класса содержит структуру расширения. Так как мы можем добавлять методы к расширениям таким образом, даже после того, как объекты были созданы - и для хранения методов расширения, необходимо выделить память - почему мы не можем добавить ivars?

1 Ответ

0 голосов
/ 18 января 2019

Поскольку расширения применяются ко всему типу (структура / класс). Для каждого экземпляра должно быть выделено хранилище ivar, и экземпляры, возможно, уже были созданы к моменту добавления расширения в систему. Информация о метатипах может быть обновлена; все существующие экземпляры (которые могут храниться в других экземплярах) не могут быть. Нет списка «всех существующих экземпляров», которые вы могли бы переместить и перераспределить (а также перераспределить их контейнеры).

Помните, что расширения могут применяться другими модулями, поэтому они могут динамически подключаться всякий раз, когда модуль загружается (что даже не обещается вообще во время запуска, не говоря уже о том, чтобы запускать код).

...