Swift之自定义main 函数

main 函数是程序的入口
在OC里,main 函数是这样的:

int main(int argc, char * argv[]) {
  @autoreleasepool {
      return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
}

main函数中执行了一个UIApplicationMain这个函数(虽然这个方法标明要返回一个 int,但其实它并不会真正的返回,而是一直存在于内存中,直到用户或者系统将应用强制终止。)

int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

各个参数的意思:

  • argc 系统传入参数的个数
  • agrv 系统传入参数的值列表
  • principalClassName表示要创建的应用程序对象(app的象征,该类必须是UIApplication或者它的字类)。如果传nil默认就表示UIApplication类。
  • delegateClassName表示 给应用程序指定一个代理对象,该类必须遵守UIApplicationDelegate协议

在应用程序启动,进入runloop并开始接收事件前,UIApplication对象会向其委托发送一个特定的消息,让应用能够完成相应的初始化工作.这个特定的消息就是我们在AppDelegate.m文件中的
application:applicationdidFinishLaunchingWithOptions:.一般而言我们可以在此方法内实现我们需要的初始化功能.

到了Swift ,main 函数就“消失了”,它的存在的形式变成了@UIApplicationMain

/// 这个标签的作用就是将标注的类作为委托,创建一个 UIApplication 并启动整个程序
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
}

当我们有需求,需要自定义一个main 函数的时候,就需要创建一个main.swift 文件

UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, NSStringFromClass(CustomApplication.self), NSStringFromClass(AppDelegate.self));

class CustomApplication: UIApplication {
    override func sendEvent(_ event: UIEvent) {
        // 在这里处理一些统一的逻辑
        super.sendEvent(event)
    }
    
    override func sendAction(_ action: Selector, to target: Any?, from sender: Any?, for event: UIEvent?) -> Bool {
        // 在这里处理一些统一的逻辑, 例如 记录行为日志
        return super.sendAction(action, to: target, from: sender, for: event)
    }
}

这样在sendEvent 和 sendAction 内部,就可以监听到事件的发送了。

你可能感兴趣的:(Swift之自定义main 函数)