Свойство не инициализируется при вызове super.init

У меня есть следующий метод init в моем контроллере представления:

init(mainViewController: UIViewController, settingsViewController: UIViewController, gap: Int) {
        self.mainViewController = mainViewController
        self.settingsViewController = settingsViewController
        self.gap = gap

        self.setupScrollView() // I get error here

        super.init(nibName: nil, bundle: nil) //and here.
    }

Метод self.setupScrollView пока выглядит так:

func setupScrollView() {
        self.scrollView = UIScrollView(frame: CGRectZero)
        self.scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
        self.view.addSubview(self.scrollView)
    }

Я получаю следующие ошибки:

self used before super.init call и Property 'self.scrollView' not initialized at super.init call

Я просмотрел аналогичный пост без везения. Любая помощь будет оценена по достоинству!


person Nilzone-    schedule 22.06.2014    source источник


Ответы (1)


Вы можете сделать это, объявив scrollView необязательным и переместив вызов метода установки ниже вызова super.init. Декларация будет выглядеть так:

var scrollView : UIScrollView?

И инициализация:

init(mainViewController: UIViewController, settingsViewController: UIViewController, gap: Int) {
    //other stuff
    super.init(nibName: nil, bundle: nil)
    self.setupScrollView()
}

func setupScrollView() {
    scrollView = UIScrollView(frame: CGRectZero)
    scrollView!.setTranslatesAutoresizingMaskIntoConstraints(false)
    view.addSubview(scrollView!)
}
person Adam    schedule 22.06.2014
comment
Это помогло, спасибо! Но зачем именно это нужно? Также я считаю, что когда аргумент является необязательным, вы должны называть его так: scrollView!.setTranslatesAutoresizingMaskIntoConstraints(false), а не принудительно разворачивать его? - person Nilzone-; 22.06.2014
comment
Вместо этого я имел в виду называть это так: scrollView?.setTranslatesAutoresizingMaskIntoConstraints(false) - person Nilzone-; 22.06.2014
comment
Это не сработает, потому что компилятор не уверен, что значение не равно нулю. Используя !, вы предполагаете, что это не ноль. Если вы не уверены, выполните дополнительную проверку перед распаковкой. - person Adam; 22.06.2014
comment
@Nilzone- в этом случае безопасно принудительно развернуть (!), Поскольку вы только что присвоили значение scrollView. - person David Berry; 22.06.2014
comment
@ Дэвид, но если бы я не был уверен, было бы правильно называть это так: scrollView?.setTranslatesAutoresizingMaskIntoConstraints(false)? Конечно, с if чеком - person Nilzone-; 22.06.2014