Что такое паттерн Prototype
Что проверяют
Понимаете ли вы разницу между копированием значения и копированием ссылки в Swift. В iOS паттерн Prototype почти всегда упирается именно в это: структуры копируются сами, а для классов копию нужно описать руками и решить, насколько она глубокая.
Как отвечать
Prototype это порождающий паттерн: новый объект создаётся клонированием готового, а не сборкой с нуля через конструктор со всеми параметрами. Уместен, когда объект дорого строить, когда его состояние сложилось в рантайме, или когда нужно много похожих объектов с небольшими отличиями.
В Swift ответ раздваивается. Для структур и перечислений паттерн встроен в язык: присваивание уже даёт копию, но вложенные ссылочные поля остаются общими. Для классов нужен явный метод клонирования.
final class DocumentTemplate {
var title: String
var tags: [String]
init(title: String, tags: [String]) {
self.title = title
self.tags = tags
}
func clone() -> DocumentTemplate {
DocumentTemplate(title: title, tags: tags)
}
}Отдельно проговорите глубину копии: поверхностная копирует ссылки, и два объекта продолжают делить одно состояние, глубокая копирует и содержимое. Из платформенного стоит назвать протокол NSCopying для наследников NSObject и копирование при записи у стандартных коллекций.
Где спотыкаются
Объявляют метод клонирования с возвращаемым типом Self в открытом для наследования классе и ловят ошибку компиляции: наследник обязан иметь требуемый инициализатор. Лечится финальным классом, обязательным инициализатором или возвратом типа протокола.
Делают поверхностную копию там, где нужна глубокая. Клон правит вложенный объект, изменение видит оригинал, и дефект всплывает на экране редактирования через несколько шагов, когда связь уже неочевидна.
Тянут паттерн в код на структурах. Если тип значимый, отдельный метод клонирования это лишний слой: достаточно присваивания и метода, который возвращает изменённую копию.