Swift中main函式去哪了?
這篇文章我是基於Swift 3下寫的,有些東西,可能會跟之前版本有些出入,不過影響不大
從我們一開始學C語言的時候,就知道main()
函式是一個程式的entry point
,這是約定俗成的東西,當然,iOS APP 也不例外。
之前我們用Xcode新建一個專案,選擇Objective-C作為開發語言,建成的工程裡面除了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 程式的入口,呼叫UIApplicationMain
函式註冊了Application代理,開始了事件迴圈。
不過,當我們新建一個Swift
工程的時候,細心的同學就會發現,找不到我們熟悉的main.swift
檔案了,同時我們也會在AppDelegate.swift
裡,發現一個@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
,它實現了main函式(程式入口)以及呼叫了Cocoa Touch上的UIApplicationMain 函式,開啟事件迴圈。
應用了這個 UIApplicationMain Attribute
也就表明,當前類作為application的代理,也就等同於這個函式的呼叫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
, 然後實現如下:
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))
這裡注意一點:如果你自己建立了main.swift
,那麼記得把@UIApplicationMain
去掉,不然會報錯'UIApplicationMain' attribute cannot be used in a module that contains top-level code
@UIApplicationMain 只是在iOS上,Mac OS上相應的是@NSApplicationMain
相關文章
- Python中的main函式解析PythonAI函式
- main函式的入口函式AI函式
- 淺談Swift中的函式式Swift函式
- 如何寫好 C main 函式AI函式
- C程式起點main函式C程式AI函式
- main函式你到底知道多少AI函式
- 匯入jar包,main函式JARAI函式
- swift 函式傳遞Swift函式
- Swift 函式提前返回Swift函式
- Swift-函式(Functions)Swift函式Function
- 理解Underscore中的去抖函式函式
- 【函式式 Swift】可選值函式Swift
- WPF啟動流程-自己手寫Main函式AI函式
- C++ 逆向之 main 函式的查詢C++AI函式
- 1.4-java入口函式Main和package功能Java函式AIPackage
- swift-bridge支援從Swift呼叫非同步Rust函式Swift非同步Rust函式
- JS 中的函式表示式和函式宣告你混淆了嗎?JS函式
- 理解Underscore中的uniq(陣列去重)函式陣列函式
- 1.7億農民工去哪了?
- Java永久代去哪兒了Java
- 【C】 33_main 函式與命令列引數AI函式命令列
- js中filter()函式,以及一些去重方法JSFilter函式
- 去抖函式的實現函式
- JS函式節流,去抖JS函式
- 【js】什麼是函式節流與函式去抖JS函式
- iOS APP啟動-Main函式之前的那些事兒iOSAPPAI函式
- 理解Swift高階函式之map, filter, reduceSwift函式Filter
- Swift3.0 呼叫C函式-_silen_nameSwift函式
- 4.2 函式的外部引數名 [Swift教程]函式Swift
- JS專題之去抖函式JS函式
- 標頭檔案包含方式,main函式的引數解析AI函式
- Rust 問答之如何獲取 main 函式的引數RustAI函式
- 從建立程式到進入main函式,發生了什麼?AI函式
- main函式解析(一)——Linux-0.11 學習筆記(五)AI函式Linux筆記
- main 函式解析(二)—— Linux-0.11 學習筆記(六)AI函式Linux筆記
- shell指令碼中main函式中$#獲取不到指令碼傳入引數個數淺析指令碼AI函式
- [JS效能優化]函式去抖(debounce)與函式節流(throttle)JS優化函式
- python中id()函式、zip()函式、map()函式、lamda函式Python函式