Какая польза от возврата самой функции в Swift - PullRequest
0 голосов
/ 10 октября 2019

Ну, я вижу некоторый синтаксис в следующей функции, которая возвращает topMostViewController. Эта функция определена в AppDelegate

func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {

            //***A topViewController which is Returning itself
            //***This is where I got Confusion
            return topViewController(controller: navigationController.visibleViewController)

        } else if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(controller: selected)
            }
        } else if let presented = controller?.presentedViewController {
            return topViewController(controller: presented)
        }
        return controller
    }

И она используется как

if (self.topViewController() as? SomeViewController) != nil {
            if orientation.isPortrait {
                return .portrait
            } else {
                return .landscape
            }
        }

Я понял, что код пытается установить ориентацию на основе видимого в настоящее время View Controller, но я непонять, зачем нужно возвращать ту же самую функцию в topViewController. Также я вижу некоторый синтаксис, такой как

extension UIApplication {
    /// The top most view controller
    static var topMostViewController: UIViewController? {
        return UIApplication.shared.keyWindow?.rootViewController?.visibleViewController
    }
}

extension UIViewController {
    /// The visible view controller from a given view controller
    var visibleViewController: UIViewController? {
        if let navigationController = self as? UINavigationController {

          // *** Here it's returning Same variable i.e visibleViewController
          // *** a function could call itself recursively. But how can a Variable calls itself recursively?

          return navigationController.topViewController?.visibleViewController
            } else if let tabBarController = self as? UITabBarController {
                return tabBarController.selectedViewController?.visibleViewController
            } else if let presentedViewController = presentedViewController {
                return presentedViewController.visibleViewController
            } else {
                return self
            }
        }
    }

Отредактировано

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Это называется рекурсия . В рекурсии есть условие, которое приводит к завершению цикла:

  • Не в navigationController, потому что у него есть другой видимый контроллер
  • Не в tabBarController, потому чтоу него есть другой видимый контроллер
  • Отсутствует другой контроллер, потому что представленный контроллер видим

, если один из них появляется -> мы спускаемся на один уровень и снова вызываем эту функцию, пока нетиз этих истинных.

2 голосов
/ 10 октября 2019

Это рекурсивная функция . Функция topViewController вызывает себя, чтобы найти самый верхний видимый контроллер. Функция завершится, когда controller?.presentedViewController вернет nil (что означает, что значение, удерживаемое контроллером, является самым верхним наиболее видимым контроллером). Вы также можете достичь того же самого без рекурсивной функции, как упомянуто здесь: Как найти самый верхний контроллер вида на iOS , но он выглядит намного чище, чем реализация зацикливания.

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