Вопрос оценивает знание механизма динамических массивов Swift и стратегии роста внутреннего буфера.
При первом добавлении создаётся буфер минимального размера. Если в буфере не хватает места, Swift выделяет новый буфер с увеличенной ёмкостью (обычно в 2 раза больше), копирует старые элементы и освобождает старый. Это обеспечивает амортизированное время вставки O(1).
Внутренний буфер:
Array хранит элементы в выделенной области памяти (buffer).
Имеет текущую ёмкость (capacity) и количество элементов (count).
Добавление элемента:
Если count < capacity, элемент просто записывается.
Если count == capacity, требуется расширение:
Выделяется новый буфер (обычно capacity * 2).
Старые элементы копируются в новый буфер.
Старый буфер освобождается.
Новый элемент добавляется.
Амортизированная сложность:
Хотя расширение дорогое (O(n)), происходит редко.
В среднем время вставки — константное O(1).
Пример:
var a: [Int] = []
for i in 1...100 {
a.append(i) // иногда будет выделяться новый буфер
}Вывод:
Механизм удвоения ёмкости позволяет сочетать быстрые добавления и экономное использование памяти.