使用Swift的子类UIApplication

在Objective C中很简单:只需更新main.m文件并更改UIApplicationMain()参数

return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class])); 

但是很快就没有main.m文件了,因为指导说

“在全球范围内编写的代码被用作程序的入口点,所以你不需要一个主函数。”

那么,如何在Swift中inheritanceUIApplication? 任何build议?

好吧,我已经find了解决scheme首先,我注意到,在AppDelegate.swift文件的顶部,有这条线

 @UIApplicationMain 

由于这一行在任何范围之外(在文件级别),所以它立即执行,并且我假设编译器将它翻译成标准的主函数。

所以,我这样做,从一个新的Swift-Only应用程序开始:

  • 注释掉@UIApplicationMain
  • 像这样添加了一个main.swift文件(FLApplication是我的子类)。
    重要的是,文件必须被命名为main.swift,因为其他文件不支持顶级语句! 您不能在其他文件中添加UIApplicationMain()调用,否则会收到此错误:

expression式不允许在顶层

这是main.swift文件( 注意语法已经更新为XCode 8 Beta 6 – 在这里可以得到matt的答案 ,如果你正在寻找编辑部分的前面的语法)

 import Foundation import UIKit UIApplicationMain( CommandLine.argc, UnsafeMutableRawPointer(CommandLine.unsafeArgv) .bindMemory( to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)), NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self) ) 

编辑 – 2016年12月
pre-XCode 8 beta 6的语法是

 import Foundation import UIKit UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate)) 

然后,使用以下代码为UIApplication子类FLApplication.swift创build一个swift文件:

 import UIKit import Foundation class FLApplication: UIApplication { override func sendEvent(event: UIEvent!) { super.sendEvent(event) println("send event") // this is an example // ... dispatch the message... } } 

现在,UIApplication正确的子类,你会看到日志中的“发送事件”消息

老编辑
作为参考,因为这已经从版本1改变到版本3,我在这里所有以前的编辑

编辑

正如胡俊峰现在所评论的,关于UIApplicationMain和main.swift文件的解释在Swift语言参考的属性部分有logging: Link

编辑 – 2015年3月

正如Thomas Verbeek评论在XCode 6.3 Beta中,您可能会发现C_ARGC和C_ARGV已分别重命名为Process.argc和Process.unsafeArgv。 main.swift文件中的UIApplicationMain调用将需要更新到:

 UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate)) 

另一种方法是扩展UIApplication而不是UIApplication它。 根据苹果公司发布的iBook ,Swift的扩展可以:

添加计算属性和计算静态属性定义实例方法和types方法提供新的初始化器定义下标定义和使用新的嵌套types使现有types符合协议

摘录自:苹果公司“Swift编程语言。

如果您在UIApplication子类中的需求得到了这些function的满足,那么扩展可能是一条路。