Swift中的main.swift与@UIApplication

2017-09-11  本文已影响559人  chernyog

感谢喵神的《100个Swift开发必备 Tip》 内容参考自 “Tip43 @UIApplicationMain”

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

======================== 朴实无华的分割线 =====================

@UIApplicationMain

注释掉@UIApplicationMain标记?

程序编译不通过,直接报错!

Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

意思应该是找不到main函数

那么我们可以尝试一下,创建一个main.swift文件,里面写上和OC类似的代码

import UIKit

class MyApplication: UIApplication {
    
}

UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate))
'UIApplicationMain' attribute cannot be used in a module that contains top-level code

一山不能容二虎!呵呵!!!

既然是自己创建的main.swift文件,那么我们可以用它做哪些事情呢?

可以全局监听事件

///  This function is called in the main entry point to create the application object and the application delegate and set up the event cycle. Even though an integer return type is specified, this function never returns. When users exits an iOS application by pressing the Home button, the application moves to the background.
///
///  @param argc       The count of arguments in argv; this usually is the corresponding parameter to main.
///  @param argv       A variable list of arguments; this usually is the corresponding parameter to main.
///  @param principalClassName       The name of the UIApplication class or subclass. If you specify nil, UIApplication is assumed.
///  @param delegateClassName        designates a subclass of UIApplication, you may designate the subclass as the delegate; the subclass instance receives the application-delegate messages. Specify nil if you load the delegate object from your application’s main nib file.
///
///  @return Even though an integer return type is specified, this function never returns.
public func UIApplicationMain(argc: Int32, _ argv: UnsafeMutablePointer<UnsafeMutablePointer<Int8>>, _ principalClassName: String?, _ delegateClassName: String?) -> Int32

那么如果我不传入nil,传入自定义的类MyApplication呢?

import UIKit

class MyApplication: UIApplication {
    override func sendEvent(event: UIEvent) {
        super.sendEvent(event)
        print("sendEvent")
    }
}
// 第三个参数不要传nil
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MyApplication), NSStringFromClass(AppDelegate))
上一篇下一篇

猜你喜欢

热点阅读