Почему вызов super является последним в этом методе, а не первым? - PullRequest
0 голосов
/ 22 декабря 2019

Я изучаю Swift по ходу дела.

Я нашел такие функции viewDidLoad(), и многие другие иногда пишутся так:

override func viewDidLoad() {
  super.viewDidLoad()
  // Do any additional setup after loading the view, typically from a nib.
}

, а иногда пишутся так:

override func viewDidLoad() {
  // Do any additional setup after loading the view, typically from a nib.
  super.viewDidLoad()
}

Я имею в виду вызов super.viewDidLoad() как первое или последнее в функции?

Какое это имеет значение для самой программы?

Ответы [ 2 ]

1 голос
/ 22 декабря 2019

Это зависит. Обычно для viewDidLoad() вы бы поставили супер-вызов в начале метода, потому что на самом деле нет причин не делать этого.

Вам нужно понять концепцию super вызовов, чтобы понятьэто лучше.
super.someFunction() вызывает функцию суперкласса. В нашем случае класс вашего пользовательского View Controller, скажем, MyViewController равен UIViewController, где изначально определено viewDidLoad(). В этом случае, когда вы переопределяете метод, вы должны вызвать вызов super, чтобы убедиться, что ничего не осталось. Обратите внимание, что в viewDidLoad(), в частности, не обязательно вызывать супер из UIViewController, хотя это рекомендуется как защитный вызов. Обычно в документации упоминается, требуется это или нет.

Если у вас был другой настраиваемый контроллер представления, скажем, MySecondViewController, который находится в подклассе из MyViewController, и вы хотели выполнить некоторые действия до viewDidLoad() из MyViewController, вы можете расположить super.viewDidLoad() из MySecondViewController в конце функций или там, где хотите, например:

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        doSomething()
    }
}

class MySecondViewController: MyViewController {

    override func viewDidLoad() {
        // Do something else before doSomething() is called by the superclass
        doSomethingElse()
        super.viewDidLoad()
    }
}
1 голос
/ 22 декабря 2019

Прежде всего, документы не говорят, что вам нужно позвонить super. Сравните это, например, с viewWillAppear(_:), чье состояние docs :

Если вы переопределите этот метод, вы должны вызвать super в какой-то момент вашей реализации.

Таким образом, вызов super необходим, только если у вас есть пользовательский подкласс UIViewController, давайте назовем его BaseViewController, что делает что-то в viewDidLoad().

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

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

class ColorfulViewController: UIViewController {
    /// Defines background color of view. Override in subclass.
    var shinyColor: UIColor = .red

    /// Sets the background color. Make sure to call `super` in subclass.
    func viewDidLoad() {
        backgroundColor = shinyColor
    }
}

class PinkViewController: ColorfulViewController {
    override var shinyColor: UIColor = .systemPink

    func viewDidLoad() {
        super.viewDidLoad() // This one doesn't matter where it goes.
        // Additional work.
    }
}

Еще один надуманный пример, где вы хотите вызвать super в конце:

class CountingViewController: UIViewController {
    var count: Int = 0

    /// Counts the subviews. When subclassing, make sure to call `super` *after*
    /// view is fully configured.
    func viewDidLoad() {
        count = view.subviews.count
    }
}

class FooViewController: CountingViewController {
    override var shinyColor: UIColor = .systemPink

    func viewDidLoad() {
        // Additional work.
        super.viewDidLoad()
    }
}
...