注意 XCode 10.1 和 Swift 5 的语法已于 2019 年 6 月更新(归功于 matt's answer here && Tung Fam's answer here ),如果您正在寻找以前的语法,请查看编辑部分.
好的,我找到了解决办法
首先,我注意到,在 AppDelegate.swift 文件的顶部,有这一行
@UIApplicationMain
由于这一行在任何范围之外(它在文件级别),它会立即执行,并且我假设编译器在标准主函数中翻译它。
所以,我这样做了,从一个新的 Swift-Only 应用程序开始:
- 注释掉了
@UIApplicationMain
- 添加了这样的 main.swift 文件(FLApplication 是我的子类)。
重要文件必须命名为 main.swift,因为其他文件不支持顶级语句!您不能在任何其他文件中添加 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 语言参考的属性部分:Link
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 月
Xcode 8 的解决方案,在 beta 6 之前
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)
)