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