Копия массива сама по себе не клонирует объекты. Обёртке нужен явный способ создать новый экземпляр каждого элемента и, при необходимости, его вложенных объектов.
Класс‑обёртка для клонирования массива объектов
Копия массива сама по себе не клонирует объекты. Обёртке нужен явный способ создать новый экземпляр каждого элемента и, при необходимости, его вложенных объектов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте обёртку, позволяющую скопировать массив, заполненный объектами пользовательских классов. При выполнении копирования каждый элемент результата должен быть отдельным экземпляром, а не ссылкой на исходный объект. Вы свободно меняете имена переменных, но все кодовые блоки (если они появятся) должны оставаться без изменений.
Ответ
Копия массива сама по себе не клонирует объекты. Обёртке нужен явный способ создать новый экземпляр каждого элемента и, при необходимости, его вложенных объектов.
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 должен действительно создавать новый объект; универсально скопировать неизвестный граф ссылок невозможно без правил клонирования. Для вложенных изменяемых объектов, циклов и разделяемых ссылок отдельно определяют глубину копирования и сохранение связей.