Как правильно переопределить init () для подкласса UITableViewController? - PullRequest
0 голосов
/ 25 декабря 2018

Мой UITableViewController подкласс MatchTableViewController имеет следующие свойства:

class MatchTableViewController: UITableViewController {
    // MARK: - Properties
    var matches = [Match]()
    var dataModel: DataModel
    var apiModel: APIModel

Я хочу инициализировать dataModel и apiModel путем переопределения инициализаторов.

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    // Init the DataModel
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedContext = appDelegate.persistentContainer.viewContext
    guard let historyEntity = NSEntityDescription.entity(forEntityName: "History",
                                                         in: managedContext)
        else {
            fatalError("Failed to load the History entry")
    }
    self.dataModel = DataModel(historyEntity: historyEntity,
                               managedContext: managedContext)

    // Init the APImodel
    self.apiModel = APIModel()
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // Error here
}


override init(style: UITableView.Style) {
    // Init the DataModel
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedContext = appDelegate.persistentContainer.viewContext
    guard let historyEntity = NSEntityDescription.entity(forEntityName: "History",
                                                         in: managedContext)
        else {
            fatalError("Failed to load the History entry")
    }
    self.dataModel = DataModel(historyEntity: historyEntity,
                               managedContext: managedContext)

    // Init the APImodel
    self.apiModel = APIModel()
    super.init(style: style)
    // Error here
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

Xcodeвыдает ошибку 'super.init' isn't called on all paths before returning from initializer сразу после двух super.init звонков.Я не уверен, что мне здесь не хватает.

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

}

при необходимости переопределить метод init инициализатор init (кодер :)) должен быть предоставлен подклассом UITableViewCell

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
0 голосов
/ 25 декабря 2018

Проблема в том, что если внутри guard значение не назначено, super.init(...) не вызывается и не необязательные переменные также не назначаются.Но вы хотите бросить fatalError в else {...}, поэтому вызывать super.init(...) здесь не имеет никакого смысла.

Так что сначала позвоните super.init(...), а затем сделайте другие вещи

override init(...) {
    super.init(...)
    ... // do other stuff
}

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

var variable: Type?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...