Комментарии 10
Спасибо, забавно. Только в 4 примере не «держит ссылку даже после окончания “срока службы” исходного массива», а ссылается на другой array в стеке, т.к. это value type.
Спасибо. Несмотря на то что внешне Array и ArraySlice являются структурами и соблюдают семантику value types, их внутреннее устройство совсем не простое.
В частности, если упростить, Array хранит внутри ссылку на класс, который реализует его буфер данных. При создании ArraySlice тот тоже ссылается на этот буфер. Т.о. уничтожение массива не приводит к уничтожению данных. И копирования содержимого буфера тут тоже нет
В частности, если упростить, Array хранит внутри ссылку на класс, который реализует его буфер данных. При создании ArraySlice тот тоже ссылается на этот буфер. Т.о. уничтожение массива не приводит к уничтожению данных. И копирования содержимого буфера тут тоже нет
Вы говорите про copy on write, array и slice ссылаются на одну и туже область памяти с данными, для оптимизации их хранения и доступа.
В 7 примере ничего странного, как и в большинстве строго-типизированных языков дженерики инвариантны, только коллекции из Swift поддерживают ковариантность, не знаю почему, возможно из-за совместимости с ObjC где можно пометить тип коллекции как __covariant/__contravariant.
Отлично, больше бы тестов на swift
Да, было интересно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Проверь себя в Swift: паззлер для любителей головоломок