在Xcode的Swift编程项目中,@NSApplicationMain有什么作用?

23

我使用Xcode 6和Swift语言创建了一个示例项目。

Xcode创建了AppDelegate.swift,并附带以下代码

import Cocoa

@NSApplicationMain

class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        // Insert code here to initialize your application
    }

    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }


}

@NSApplicationMain 是什么意思?我的 main.mm/main.m 文件中的 main() 函数在哪里?


可能是重复的问题:https://dev59.com/bGAf5IYBdhLWcg3wizWu(这是针对iOS的`@UIApplicationMain`,但在OSX中也适用于`@NSApplicationMain`) - Alladinian
1个回答

40

如同在发布说明中所提到的:

现在,OS X应用程序可以将@NSApplicationMain属性应用于其应用程序委托类,以便为应用程序生成隐式主函数。 这个属性的工作方式与iOS应用程序的@UIApplicationMain属性相同。

基本上,这是一种无需编写一些全局级别样板代码的方法来启动和运行您的应用程序,而是可以直接在应用程序委托类中使用该属性。在之前的Xcode版本中,在创建新的Swift Cocoa项目时,Xcode会为新的OS X项目生成一个main.swift文件,该文件看起来像这样:

import Cocoa

NSApplicationMain(Process.argc, Process.unsafeArgv)

这是主入口点。现在,Xcode不再生成此文件;相反,它只是用@NSApplicationMain标记您的应用程序代理,并且这个引导步骤在后台处理。

更多信息可从The Swift Programming Language中了解:

将此属性应用于类以指示它是应用程序委托。使用此属性等同于调用NSApplicationMain函数并将该类的名称作为委托类的名称传递。

如果您不使用此属性,请提供一个带有调用NSApplicationMain函数的main函数的main.swift文件。例如,如果您的应用程序使用自定义的NSApplication子类作为其主要类,请调用NSApplicationMain函数而不是使用此属性。


有没有一种方法可以使用不同的名称来命名 main.swift,也许有编译器选项?我正在尝试找到一种方法,使得两个不同的目标可以使用自己的 main.swift 入口点,但是又能够将它们都存储在同一个文件夹中。 - Ian Bytchek
@IanBytchek 如果你正在使用 @NSApplicationMain 属性,我认为文件的名称并不重要,但是我现在不在 Mac 上进行检查。只要每个目标在其构建中仅包含一个主入口点,我认为将它们存储在同一文件夹中就可以了。如果你遇到问题,最好提出一个关于你具体问题的新问题。 - Matt Gibson
我的理解是 @NSApplicationMain 只能放在应用程序代理前面,放在其他任何地方都无法编译。 - Ian Bytchek
@IanBytchek 是的,看起来 main.swift 绝对是一个特殊的、具有特定名称的文件(https://developer.apple.com/swift/blog/?id=7),必须被称为 main.swift。在我看来,如果你想要在同一个文件夹中存储两个不同的纯 Swift 应用程序及其入口点文件,那么你可能会很遗憾。但是如果你想确保,你应该单独提出一个问题。 - Matt Gibson
没问题,我会像普通人一样使用@NSApplicationMain - Ian Bytchek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接