Как установить необязательную переменную с удобным инициализатором в swift?

У меня есть подкласс UITableViewController, который не должен работать, если нет модели. Если нет модели, нет никакой цели показывать представление.

Поэтому я думаю, что мое свойство модели не должно быть необязательным значением. Я хочу такой безопасности. Так что я пытаюсь создать удобный init, который передает мою модель.

let model:Client

override init() {
    super.init(style: UITableViewStyle.Plain)
}

convenience init(model:Client) {
    self.init()
    self.model = model
}

Моя проблема в том, что я получаю эту ошибку:

Property 'self.model' not initialised at super.init call

Это имеет смысл. Если вызвать init(), свойство не будет установлено, как того требует необязательное свойство.

Я преодолею это?

Имейте в виду, что эта модель - моя настоящая Модель, установка значения по умолчанию здесь была бы бессмысленной, и опять-таки, отказ от безопасности, которую я ищу.

Спасибо!

Небольшое примечание: делать это не будет работать также. Там нет экземпляра для установки модели в любом случае.

convenience init(model:Client) {
    self.model = model
    self.init()
}

Изменить: подход ниже показался многообещающим

let model: Client

required init(coder aDecoder: NSCoder) {
    preconditionFailure("Cannot initialize from coder")
}

init(model:Client) {
    self.model = model
    super.init(style: UITableViewStyle.Plain)
}

Тем не менее, он получает мне эту ошибку:

fatal error: use of unimplemented initializer 'init(nibName:bundle:)'

И, наконец, решение здесь было позвонить:

super.init(nibName: nil, bundle: nil)

1 ответ

Решение

Вам не нужно переопределять init() здесь, и вы хотите сделать init(model:) ваш назначенный инициализатор (не удобство). Вы можете сделать это так

let model: Client

required init(coder aDecoder: NSCoder) {
    preconditionFailure("Cannot initialize from coder")
}

init(model:Client) {
    self.model = model
    super.init(style: UITableViewStyle.Plain)
}
Другие вопросы по тегам