#swift #constructor #sprite-kit
#swift #конструктор #sprite-kit
Вопрос:
Я пытаюсь создать подкласс SKShapeNode, который принимает определенную ширину и высоту и занимает позицию только в своем инициализаторе. По сути, мне нужен класс, который создает одинаковые поля, но позволяет мне инициализировать их с разными начальными позициями.
Когда я попытался реализовать это, я получаю сообщение об ошибке, которое говорит мне Must Call a designated initializer of the superclass 'SKShapeNode'
, что я не понимаю, как то, что я реализовал, не вызывает назначенный инициализатор. Мне не разрешено устанавливать общий предопределенный инициализатор для вызова подкласса в super?
Когда я пытаюсь сделать это удобным инициализатором, как следует из сообщения, у тега self нет свойств инициализатора для использования. Честно говоря, то, что я закодировал, — это именно то, что я хочу, мне просто нужен кто-то, кто поможет мне сделать это.
Ответ №1:
SKShapeNode не определяет назначенный инициализатор, поэтому он наследует SKNode, который есть init()
. Ваш класс определяет назначенный инициализатор: init
и (непреднамеренно) init(coder:)
. Создав не удобный инициализатор, вы отключили наследование инициализатора и сделали невозможным использование удобных инициализаторов вашего суперкласса.
Вместо этого вы хотите просто связать новую удобную инициализацию с удобной инициализацией SKShapeNode. Чтобы сделать это, избавьтесь от инициализации «coder» и отметьте свой инициализацию convenience
. Затем он может подключиться к другим унаследованным удобным инициалам, вызвав self.init(...)
:
class DigitObject: SKShapeNode {
convenience init(x: CGFloat, y: CGFloat) {
self.init(rect: CGRect(x: x, y: y, width: CGFloat(9*3), height: CGFloat(9*5)))
}
}
Подробнее о правилах см. В разделе Делегирование инициализатора для типов классов . Подробнее о том, почему это работает таким образом, см. Почему мы не можем вызвать инициализатор удобства суперкласса из подкласса?И чтобы немного развлечься о том, почему Swift так заботится об этом, вы можете посмотреть, как Джеймс Демпси поет о том, как менее строгие правила сожгли нас в Objective-C.