我需要帮助了解何时使用@main
和@uiapplicationmain
。
据我所知,@uiapplicationmain
是调用uiapplicationmain(:::)
的一种更简单的方法,其中在@uiapplicationmain
之后生成的类被用作应用程序委派。我还知道它还创建了一个UIApplication
。
我也知道应用程序委托成为项目的切入点。
根据我所读到的内容,我被告知@main
也是一个入口点,但它需要一个主要功能。
我想知道的是,他们所说的主要切入点是什么意思。就像Xcode在做什么;条目";指向整个@main
是如何工作的,比如它与@uiapplicationmain
有何不同,以及它对Xcode运行代码的方式有什么影响。
所有代码都有一个入口点:调用该代码的人实际调用的地方。包含许多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是iOS 14中引入的新SwiftUI生命周期的一部分。
@uiapplicationmain是UISceneDelegate和UIApplicationDelegate的旧版本,但仍在使用中。两者都代表应用程序的生命周期。