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函式
- Java——main函式JavaAI函式
- 淺談Swift中的函式式Swift函式
- Swift,函式Swift函式
- swift 函式Swift函式
- 【函式式 Swift】函式式思想函式Swift
- 理解Underscore中的去抖函式函式
- 【函式式 Swift】QuickCheck函式SwiftUI
- 如何寫好 C main 函式AI函式
- main函式你到底知道多少AI函式
- 匯入jar包,main函式JARAI函式
- C程式起點main函式C程式AI函式
- C#中Main函式後引數的處理C#AI函式
- Java永久代去哪兒了Java
- JavaScript 中函式節流和函式去抖的講解JavaScript函式
- PHP 7 來了,PHP 6 去哪兒了?PHP
- swift 函式傳遞Swift函式
- Swift 函式提前返回Swift函式
- Swift-函式(Functions)Swift函式Function
- 【函式式 Swift】可選值函式Swift
- main函式返回值的處理AI函式
- windows命令列下如何呼叫main函式Windows命令列AI函式
- 我最新的慢日誌去哪了?
- 理解Underscore中的uniq(陣列去重)函式陣列函式
- JS 中的函式表示式和函式宣告你混淆了嗎?JS函式
- 關於Swift中的泛函式find的問題Swift函式
- 1.4-java入口函式Main和package功能Java函式AIPackage
- WPF啟動流程-自己手寫Main函式AI函式
- Main函式引數argc,argv如何傳入AI函式GC
- C++ main函式命令列引數使用C++AI函式命令列
- C++ 逆向之 main 函式的查詢C++AI函式
- js中filter()函式,以及一些去重方法JSFilter函式
- Swift3.0 -- 建構函式Swift函式
- 程式怎麼判斷一個go原始檔中是否有main函式?GoAI函式
- linux中,C程式第一個執行的並不是main()函式LinuxC程式AI函式
- 去抖函式的實現函式
- JS函式節流,去抖JS函式