Swift 中没有
main()
方法。程序必须从某个地方开始执行。那么swift代码执行的入口点是什么呢,又是如何决定的呢?
普通 Swift 模块中的入口点是模块中名为
main.swift
的文件。 main.swift
是唯一允许在顶层包含表达式和语句的文件(模块中的所有其他 Swift 文件只能包含声明)。
@UIApplicationMain
的实现上使用 UIApplicationDelegate
属性 而不是 main.swift
文件来标记入口点。 Cocoa 曾经使用一个最小的 main.swift
文件,简单地称为 NSApplicationMain
,但是 自 Xcode 6.1 开始,在 @NSApplicationMain
的实现上使用 NSApplicationDelegate
属性。
在
AppDelegate.swift
文件中您可以看到 @UIApplicationMain
。
基本上:
main.m
和AppDelegate.m
有点合并在Swift
中,只是AppDelegate.swift
您可能想阅读文件和初始化
例外是一个名为“main.swift”的特殊文件,它的行为非常多 就像游乐场文件一样,但是是用应用程序的源代码构建的。这 “main.swift”文件可以包含顶级代码,并且依赖于顺序 规则也适用。实际上,运行的第一行代码 “main.swift”被隐式定义为主要入口点 程序。这使得最小的 Swift 程序可以是一行—— 只要该行位于“main.swift”中即可。
在 Xcode 中,Mac 模板默认包含“main.swift”文件,但是 对于 iOS 应用程序,新 iOS 项目模板的默认设置是添加 @UIApplicationMain 到常规 Swift 文件。这会导致编译器 为您的 iOS 应用程序合成一个主入口点,并消除 需要一个“main.swift”文件。
或者,您可以链接到用以下语言编写的 main 实现 Objective-C,在逐步迁移项目时很常见 Objective-C 到 Swift。
在 Swift 5.3 中,有一个新的
@main
属性,可让您控制入口点在项目中的位置,而不仅仅是 main.swift
。只能有一个主条目,并且不能拥有 main.swift
文件和属性 @main
。请参阅 https://github.com/apple/swift-evolution/blob/master/proposals/0281-main-attribute.md 了解更多详细信息。
@main
struct App {
static func main() {
print("Starting.")
}
}
更新:Swift 6 已过时并在使用时导致错误:
@UIApplicationMain
(可可味)@NSApplicationMain
(可可)从现在开始,如果你想在 Swift 6 语言模式下编译,你必须使用
@main
。
在 Swift 应用程序中,有以下属性:
@UIApplicationMain
(可可味)@NSApplicationMain
(可可)告诉 swift 编译器应用程序的入口点在哪里。
Swift 编译器在底层所做的是创建一个
main
函数,该函数看起来与 Objective-C 应用程序中的基本相同,并将此方法视为应用程序的入口点(当应用程序进程启动时调用的第一个方法)开始)。
如果您想了解更多有关 swift 编译器如何使用
Main
属性、操作系统如何知道应用程序的入口点在哪里的信息,我鼓励您阅读这篇文章:了解 iOS 应用程序入口点
普通 Swift 模块中的入口点是被调用的模块中的文件。