這篇文章我是基于Swift 3下寫的章郁,有些東西,可能會跟之前版本有些出入志衍,不過影響不大
從我們一開始學C語言的時候暖庄,就知道main()
函數(shù)是一個程序的entry point
,這是約定俗成的東西楼肪,當然培廓,iOS APP 也不例外。
之前我們用Xcode新建一個項目春叫,選擇Objective-C作為開發(fā)語言肩钠,建成的工程里面除了AppDelegate.m
、Main.storyboard
等再熟悉不過的文件暂殖,還有一個main.m
价匠,既熟悉又陌生。
int main(int argc, char * argv[]) {
@autoreleasepool {
MCSLog(@"%s", argv[0]);
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
同樣的呛每,這也是我們一個iOS 程序的入口踩窖,調(diào)用UIApplicationMain
函數(shù)注冊了Application代理,開始了事件循環(huán)莉给。
不過毙石,當我們新建一個Swift
工程的時候,細心的同學就會發(fā)現(xiàn)颓遏,找不到我們熟悉的main.swift
文件了徐矩,同時我們也會在AppDelegate.swift
里,發(fā)現(xiàn)一個@UIApplicationMain
Attribute叁幢。
官方文檔這么描述的:
UIApplicationMain
Apply this attribute to a class to indicate that it’s the application delegate.
Using this attribute is equivalent to calling the UIApplicationMain function and passing this class’s name as the name of the delegate class.
還有Stack上的回答也很詳細滤灯,建議看看。
原來曼玩,@UIApplicationMain
就是為了取代我們在OC項目中的main.m
鳞骤,它實現(xiàn)了main函數(shù)(程序入口)以及調(diào)用了Cocoa Touch上的UIApplicationMain 函數(shù),開啟事件循環(huán)黍判。
應用了這個 UIApplicationMain Attribute
也就表明豫尽,當前類作為application的代理,也就等同于這個函數(shù)的調(diào)用UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
因此顷帖,你也可以簡單認為美旧,AppDelegate.swift
跟main.swift
通過這個Attribute合并為一體了渤滞,AppDelegate.swift
也成為initial entry file
.
那么,你自己新建MyAppDelegate.swift
榴嗅,然后Apply @UIApplicationMain妄呕,同樣也是可以的
// 使用@UIApplicationMain,必須要遵循UIApplicationDelegate嗽测,不然編譯器會報如下錯誤
// 'UIApplicationMain' class must conform to the 'UIApplicationDelegate' protocol
@UIApplicationMain
class MyAppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
}
到這里绪励,可能有些同學就會問,那我自己建個main.swift
文件呢唠粥?當然可以疏魏!
新建一個main.swift
,這里注意一點厅贪,文件名稱必須是main.swift
, 然后實現(xiàn)如下:
import UIKit
import Foundation
// Swift 2 使用Process.argc
let argc = CommandLine.argc // Swift 3 把 Process改為CommandLine 了
let argv = UnsafeMutablePointer<UnsafeMutablePointer<Int8>>.allocate(capacity: Int(CommandLine.argc))
// let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc))
UIApplicationMain(argc, argv, nil, NSStringFromClass(AppDelegate.self))
這里注意一點:如果你自己創(chuàng)建了main.swift
蠢护,那么記得把@UIApplicationMain
去掉雅宾,不然會報錯
'UIApplicationMain' attribute cannot be used in a module that contains top-level code
@UIApplicationMain 只是在iOS上养涮,Mac OS上相應的是@NSApplicationMain