Класс‑обёртка для клонирования массива объектов

Копия массива сама по себе не клонирует объекты. Обёртке нужен явный способ создать новый экземпляр каждого элемента и, при необходимости, его вложенных объектов.

Короткий ответ

Что ответить на собеседовании

Копия массива сама по себе не клонирует объекты. Обёртке нужен явный способ создать новый экземпляр каждого элемента и, при необходимости, его вложенных объектов.

Подробный разбор

Ответ с пояснениями

Условие

Реализуйте обёртку, позволяющую скопировать массив, заполненный объектами пользовательских классов. При выполнении копирования каждый элемент результата должен быть отдельным экземпляром, а не ссылкой на исходный объект. Вы свободно меняете имена переменных, но все кодовые блоки (если они появятся) должны оставаться без изменений.

Ответ

Копия массива сама по себе не клонирует объекты. Обёртке нужен явный способ создать новый экземпляр каждого элемента и, при необходимости, его вложенных объектов.

struct CopyingArray<Element: AnyObject> {
    let elements: [Element]
    let cloneElement: (Element) -> Element
    func cloned() -> [Element] {
        elements.map(cloneElement)
    }
}

final class Item {
    var name: String
    init(name: String) { self.name = name }
}

let source = [Item(name: "A")]
let wrapper = CopyingArray(elements: source) { Item(name: $0.name) }
let copy = wrapper.cloned()

Теперь copy[0] !== source[0]. Контракт cloneElement должен действительно создавать новый объект; универсально скопировать неизвестный граф ссылок невозможно без правил клонирования. Для вложенных изменяемых объектов, циклов и разделяемых ссылок отдельно определяют глубину копирования и сохранение связей.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее