使用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的满足,那么扩展可能是一条路。