Answers:
注意:如果您正在寻找以前的语法,请在2019年6月对XCode 10.1和Swift 5的语法进行了更新(此处提供了matt的答案,此处是&Tung Fam的提供了答案)。
好,我找到了解决方案
首先,我注意到,在AppDelegate.swift文件的顶部,有这行
@UIApplicationMain
由于此行在任何范围之外(在文件级别),因此将立即执行,并且我假设编译器将其转换为标准的main函数。
因此,我从一个新的Swift-Only应用程序开始执行此操作:
@UIApplicationMain
不允许在顶层使用表达式
这是main.swift文件
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv,
NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self)
)
然后,使用以下代码为UIApplication子类FLApplication.swift创建一个swift文件:
import UIKit
import Foundation
class FLApplication: UIApplication {
override func sendEvent(_ event: UIEvent) {
super.sendEvent(event)
print("send event")
}
}
现在,UIApplication已正确子类化,您将在日志中看到“发送事件”消息
旧版本
供参考,由于此版本从版本1到版本3发生了很大变化,因此我将所有以前的编辑保留在此处
编辑-2015年3月
正如UIApplicationMain
胡俊峰所评论的那样,有关和main.swift文件的说明已记录在《 Swift语言参考:链接》的 “属性”部分中。
如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))
XCode 8之前的语法是
import Foundation
import UIKit
UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
编辑-2016年12月
Beta 6之前的Xcode 8解决方案
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)
)
sendEvent:
今天的重载用例是什么(我记得必须在iOS 3中使用它)
UIApplicationMain
并main.swift
在The Swift Language Reference的Attributes部分中进行了说明。developer.apple.com/library/ios/documentation/Swift/Conceptual/...
C_ARGC
和C_ARGV
已经分别重命名为Process.argc
和Process.unsafeArgv
。您需要将main.swift文件中的UIApplicationMain调用更新为UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(KBApplication), NSStringFromClass(AppDelegate))
创建的子类UIApplication
并添加逻辑
import UIKit
class CustomUIApplication: UIApplication {
override func sendEvent(_ event: UIEvent) {
super.sendEvent(event)
}
}
创建一个main.swift
调用UIApplicationMain()
全局函数[About]的文件,该文件是OS调用的应用程序的新入口点。该函数从被调用函数,UIApplication
类名,UIApplicationDelegate
类名接收参数,并启动主运行循环。
import UIKit
UIApplicationMain(
CommandLine.argc,
CommandLine.unsafeArgv,
NSStringFromClass(CustomUIApplication.self), //was created at step 1
NSStringFromClass(AppDelegate.self)
)
删除/注释@UIApplicationMain
默认注释AppDelegate
。
@UIApplicationMain
产生main.swift
。
如果您不这样做,将会得到一个编译错误:
UIApplicationMain
属性不能在包含顶级代码的模块中使用
//@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
//...
}
UIApplicationMain()
参数,NSPrincipalClass
在app-info.plist 下添加类名?