Рассмотрим два класса. Первый - это Vehicle
, подкласс NSObject
, который соответствует NSCopying
:
class Vehicle : NSObject, NSCopying {
var wheels = 4
func copyWithZone(zone: NSZone) -> AnyObject {
let vehicle = self.dynamicType()
vehicle.wheels = self.wheels
return vehicle
}
}
Второй класс Starship
наследует от Vehicle
:
class Starship : Vehicle {
var photonTorpedos = 6
var antiGravity = true
override func copyWithZone(zone: NSZone) -> AnyObject {
let starship = super.copyWithZone(zone) as Starship
starship.photonTorpedos = self.photonTorpedos
starship.antiGravity = self.antiGravity
return starship
}
}
Этот код не компилируется, потому что:
Построение объекта типа класса "Транспортное средство" с значением метатипа должно использовать "требуемый" инициализатор.
Итак, я иду и добавляю требуемый инициализатор:
required override init () {
super.init()
}
И теперь приложение компилируется, а Starship
объекты отвечают на copy()
правильно.
Два вопроса:
- Почему для построения объекта с метатипом нужен инициализатор
required
? (Кажется, инициализатор, который я написал, ничего не делает.) - Есть ли что-то, что я написал неправильно, или добавить в инициализатор? Есть ли случай, который я не рассматриваю?