【问题标题】:What is the differnce between @main and @uiapplicationmain@main 和 @uiapplicationmain 有什么区别
【发布时间】:2021-07-29 10:00:08
【问题描述】:

我需要帮助了解何时使用 @main@uiapplicationmain

据我所知,@uiapplicationmain 是调用uiapplicationmain(:::) 的一种更简单的方法,其中@uiapplicationmain 之后创建的类用作App Delegate。我也知道它还会创建一个UIApplication

我也知道应用委托成为项目的入口点。

据我阅读,有人告诉我@main 也是一个入口点,但它需要一个主函数。

我想知道的是主入口点是什么意思。就像 Xcode 正在做什么以使其成为“入口”点。以及整个 @main 是如何工作的,它与 @uiapplicationmain 有何不同,以及它对 Xcode 运行代码的方式有何影响。

【问题讨论】:

    标签: swift uikit


    【解决方案1】:

    所有代码都有一个入口点:调用该代码的人实际调用的地方。包含许多 Swift 文件的 整个 程序实际上是如何启动的?我们需要一个整个程序的入口点,运行时将调用它来启动我们。

    在 Swift 中,这是 main.swift 文件。它的工作是调用 UIApplicationMain,它会创建一些实例,包括应用程序和应用程序委托,并让事件循环运行(并在应用程序运行的其余时间保持运行)。一个最小的 main.swift 文件应该是这样的:

    import UIKit
    UIApplicationMain(
        CommandLine.argc, CommandLine.unsafeArgv, nil, 
            NSStringFromClass(AppDelegate.self)
    )
    

    然而,从来没有人使用过 main.swift 文件!这是样板,那何必呢?相反,你说@main,然后在后台为你生成一个main.swift 文件。特别是,您将属性 @main 放在 AppDelegate 类上,因此 main.swift 生成器知道要将哪个类实例化为您的应用程序委托。

    还有两件事要知道:

    • 在 Swift 5.3 之前,@main 被称为 @UIApplicationMain。从这个角度来看,它们是相同的,是同一事物的两个名称。

    • Swift 5.3 和 Xcode 12 中的新功能,您可以将自己的类型之一指定为 @main 并给它一个静态的 main 函数,您可以在其中执行您在 main.swift 文件。这是@UIApplicationMain 做不到的:

        @main
        struct MyMain {
            static func main() -> Void {
                 UIApplicationMain(
                     CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(AppDelegate.self)
                 )
            }
        }
    
    

    【讨论】:

    • 抱歉,您能否进一步解释第二个指针,因为它没有为我点击。据我了解,您所说的 @main 还允许您在任何地方指定一个 main 函数,并且与 main.swift 文件的工作方式相同。
    【解决方案2】:

    @main 是 iOS 14 中引入的新 SwiftUI lifecycle 的一部分。

    @uiapplicationmain 是旧版本,属于UISceneDelegateUIApplicationDelegate,但仍在使用中。两者都代表您应用的生命周期。

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 2016-07-24
      • 2011-05-10
      相关资源
      最近更新 更多