Подкласс Swift, вызывающий super.init с параметрами

#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.