Прототип
Суть
Прототип — готовый объект-образец, с которого копируют новые объекты вместо того, чтобы конструировать их с нуля. В языках с прототипным наследованием (JavaScript) это основа объектной модели: объект ссылается на прототип и наследует его свойства динамически. Swift и Objective-C — классовые языки, поэтому для iOS-разработчика «прототип» — это прежде всего паттерн Prototype: клонирование объекта с его состоянием.
Как это выглядит в Swift
import Foundation
final class Document: NSCopying {
var title: String
var tags: [String]
init(title: String, tags: [String]) { self.title = title; self.tags = tags }
func copy(with zone: NSZone? = nil) -> Any {
Document(title: title, tags: tags) // копируем нужные поля сами
}
}
let template = Document(title: "Отчёт", tags: ["draft"])
let doc = template.copy() as! Document
doc.title = "Отчёт за Q3"
print(template.title) // Отчёт — прототип не изменился
// Для struct «прототип» бесплатен: присваивание уже делает копию
struct Theme { var accent = "blue"; var font = "SF Pro" }
let base = Theme()
var dark = base
dark.accent = "purple"
print(base.accent, dark.accent) // blue purple
NSCopying/copy()— протокол Foundation для клонирования объектов классов; им пользуютсяNSString,NSArray,UIFont. Атрибут@NSCopyingна свойстве копирует присваиваемое значение автоматически.- Для value types паттерн не нужен: копирование встроено в семантику языка. Это одна из причин, почему модели в Swift делают через
struct. - Глубокая vs поверхностная копия:
copy()по умолчанию не клонирует вложенные объекты классов — это нужно делать явно.
Где встречается в iOS
- Шаблоны настроек, стили, конфигурации запросов (
URLRequest— struct, копируется сам). - Prototype cells в сториборде — ячейка-образец, по которой таблица создаёт экземпляры (на практике их инстанцирует
dequeueReusableCell, а не копирует).
На что смотрит интервьюер
Отличаете ли вы прототипное наследование (JavaScript) от паттерна Prototype, и понимаете ли, что в Swift клонировать нужно только reference types, а для struct это бесплатно.