@main和@uiapplicationmain之间有什么区别



我需要帮助了解何时使用@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的旧版本,但仍在使用中。两者都代表应用程序的生命周期。

最新更新