在 Swift 中返回相同函数本身有什么用

What is the Use of Returning the Same function itself in Swift

好吧,我在下面的函数中看到了一些语法,returns 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
            }
        }

我知道代码试图根据当前可见的视图控制器设置方向,但我不明白在 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
            }
        }
    }

已编辑

它是一个 recursive function. The topViewController function calls itself to find the top most controller which is visible. The function will exit when controller?.presentedViewController returns nil (Which means that the value held by controller is the top most visible controller). You can also achieve the same without a recursive function as mentioned here: How to find topmost view controller on iOS,但它看起来比循环实现更干净。

也就是所谓的递归。递归中有一个条件导致循环结束:

  • 不在navigationController,因为它有另一个可见的控制器
  • 不在tabBarController,因为它有另一个可见的控制器
  • 不显示另一个控制器,因为显示的控制器可见

如果其中一个出现 -> 我们下一层并再次调用此函数,直到 none 个为真。