Документация говорит
Классы имеют дополнительные возможности, которых нет у структур:
- Подсчет ссылок позволяет использовать более одной ссылки на экземпляр класса.
Таким образом, let tw as! TwoWheelsProtocol
всегда создает новый объект, поскольку TwoWheels
является структурой. Чтобы избежать этого, вы можете превратить TwoWheels
в класс:
class TwoWheels: TwoWheelsProtocol {
var id: String
var uniqueTwoWheelsAttribut: String
init(id: String, uniqueTwoWheelsAttribut: String) {
self.id = id
self.uniqueTwoWheelsAttribut = uniqueTwoWheelsAttribut
}
}
Теперь let tw as! TwoWheelsProtocol
не создает новую копию, а только новую ссылку на объект.
Что вы можете улучшить
Требуется VehicleProtocol
, чтобы разрешить только классам реализовывать протокол. Таким образом, вы можете быть уверены, что приведение и внесенное изменение действительно изменяют ссылочный объект, а не просто его копию.
protocol VehicleProtocol: class {
var id: String { get }
}
Вы можете использовать более компактный метод литья.
if var tw = vehicle as? TwoWheelsProtocol {
// Modify tw.
}
guard var tw = vehicle as? TwoWheelsProtocol else {
return
}
// Modify tw.