Вы можете воспользоваться типами значений, которые по умолчанию глубоко копируются, предостережение в том, что все члены также являются типами значений (структуры, перечисления, кортежи), и эти члены содержат только типы значений и т. Д.
struct NearbyStopsViewModel {
var stopViewModels: [StopViewModel]
}
struct StopViewModel {
var stop: Stop
var name: String
var departures: [DepartureViewModel]?
}
struct DepartureViewModel: NSObject {
var departure: Departure
var name: String
}
struct Departure {
// fields needed for the struct
}
При такой иерархии каждое присвоение любому из вышеперечисленных типов приведет к глубокой копии всех базовых элементов. Вы позволяете компилятору делать всю работу за вас.
Остерегайтесь, однако, могут возникнуть некоторые проблемы с производительностью, если вы работаете с большим количеством этих значений (для достаточной суммы производительность не заметна).