Удобство инициации без аргументов в Swift? - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь создать такой класс:

class Brick2 : SKShapeNode {

   override convenience init() {

       self.init(rectOf: CGSize(width: UIScreen.main.bounds.width/5, height: UIScreen.main.bounds.width/5), cornerRadius: UIScreen.main.bounds.width/20)

}

Код компилируется, но когда я запускаю приложение в симуляторе, он вылетает.

Дело в том, что с этимв другом классе это работает:

class Sidebar : SKShapeNode {

    convenience init(rectOf: CGSize, cornerRadius: CGFloat, y: CGFloat) {

         self.init(rectOf: rectOf, cornerRadius: cornerRadius)        
         self.position = CGPoint(x: UIScreen.main.bounds.width, y : y)
    }
}

Если я не переопределяю init с помощью аргумента, который работает, но не переопределяю его.

Я хочу создать экземпляр класса Brick2, не пропуская ни одногоаргумент, потому что все кирпичи будут иметь одинаковый размер.

Редактировать: ошибка в XCode является "Поток 1: EXC_BAD_ACCESS (код = 2, адрес = 0x7ffee4f8fff8)"

1 Ответ

0 голосов
/ 20 октября 2018

Похоже, init(), который вы пытаетесь переопределить, не принадлежит SKShapeNode или его суперклассу SKNode , или его суперклассу UIResponder ;но он переопределяет корневой класс NSObject '* init().

Практически вы не можете переопределить указанный инициализатор (init()) и использовать вспомогательный инициализатор (init(rect:cornerRadius:))для инициализации объекта.

Чтобы служить цели того, чего вы пытаетесь достичь, я бы предложил следующее:

class Brick2: SKShapeNode {

    // Make init() inaccessible to other classes, to prevent the accidental usage of the same,
    // instead of the expected instance() method call.
    private override init() {
        super.init()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    class func instance() -> Brick2 {
        return Brick2(rectOf: CGSize(width: UIScreen.main.bounds.width / 5,
                                     height: UIScreen.main.bounds.width / 5),
                      cornerRadius: UIScreen.main.bounds.width / 20)
    }
}

Затем вы можете инициализировать свой Brick2 использование экземпляра:

let brick = Brick2.instance()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...