Подтвердить что ты не робот

Почему/когда нам нужно вызвать super.ViewDidLoad?

Все говорят мне: "Используйте super.viewDidLoad(), потому что это просто так" или "Я делаю это всегда так, так что держите его", "Это неправильно, если вы не называете супер" и т.д.

override func viewDidLoad() {
    super.viewDidLoad()
    // other stuff goes here
}

Я нашел несколько тем о случаях Objective-C, и они не были настолько просветляющими, но я развиваюсь в Swift 3, так что может ли любой эксперт дать мне хорошее подробное объяснение по этому поводу?

Является ли это примером только хорошей практики или есть какие-то скрытые эффекты?

4b9b3361

Ответ 1

Обычно рекомендуется называть супер для всех функций, которые вы переопределяете, которые не имеют возвращаемого значения.

Вы не знаете реализацию viewDidLoad. UIViewController может делать некоторые важные настройки там, а не вызывать это не даст ему возможность запустить собственный viewDidLoad код.

То же самое происходит при наследовании от подкласса UIViewController.

Даже если вызов super.viewDidLoad ничего не делает, всегда называть его хорошей привычкой. Если вы привыкнете не называть его, вы можете забыть позвонить ему, когда это необходимо. Например, при подклассификации ViewController, который зависит от него от сторонней структуры или от вашей собственной базы кода.

Возьмите этот надуманный пример:

class PrintingViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print("view has loaded")
    }
}

class UserViewController: PrintingViewController {
    override func viewDidLoad() {
    super.viewDidLoad()

     // do view setup here
    }

}

Не вызывать viewDidLoad здесь никогда не даст PrintingViewController шанс запустить свой собственный viewDidLoad код

Если вы не хотите ничего делать в viewDidLoad, просто не реализуйте его. В любом случае супер-метод будет вызываться.

Ответ 2

Это зависит от реализации viewDidLoad в классе UIViewController (из которого наследуют все контроллеры представления). Если он пуст, чем вызов super.viewDidLoad(), он не будет делать многого. Однако, если у него есть некоторые функции в отношении контроллера вида, вы наверняка захотите его использовать.

Поскольку это не в ваших руках относительно реализации UIViewController, вы всегда должны вызывать этот метод

Ответ 3

Я думаю, что вызов super.viewDidLoad() - это, прежде всего, хорошая практика.

Обычная вещь в iOS - это делать все настройки вашего подкласса после того, как суперкласс выполнил настройку, которую ему нужно выполнить (инициализация свойств, прокладка вещей и т.д.). Если вы не дадите суперклассу возможность обрабатывать все его настройки, прежде чем начинать менять ситуацию, возможно, вы столкнетесь с некоторыми странными ошибками и поведением.

Мы можем провести параллель с инициализацией класса: "Назначенный инициализатор должен делегировать до инициализатора суперкласса перед назначением значения унаследованному свойству". Мы делаем это, чтобы убедиться, что все свойства суперкласса имеют ценность и на основе этого факта мы можем безопасно использовать их через наследование в нашем подклассе.

Правило большого пальца:

  • При инициализации/настройке сначала выполняйте реализации суперкласса.
  • При отрыве/очистке выполните последнюю версию суперкласса.

Предполагая, что viewDidLoad() - это своего рода инициализация, мы должны сначала вызвать super.viewDidLoad(), чтобы правильно установить вещи в суперклассе.

Если мы проверим реализацию viewDidLoad() в базовом классе UIViewController, мы увидим, что он пуст. Так что, может быть, единственная причина вызова super.viewDidLoad() из вашего дочернего класса - хороший стиль кодирования:-) Давайте последуем за ним!