迅速なコード実行のエントリポイントは何ですか?


105

main()迅速な方法はありません。プログラムはどこかから実行を開始する必要があります。それでは、迅速なコード実行のエントリポイントは何ですか?それはどのように決定されますか?

回答:


94

単純なSwiftモジュールのエントリポイントは、というモジュール内のファイルですmain.swiftmain.swiftトップレベルで式とステートメントを持つことが許可されている唯一のファイルです(モジュール内の他のすべてのSwiftファイルは宣言のみを含むことができます)。

Cocoa Touchは、ファイルではなく実装の@UIApplicationMain属性を使用して、エントリポイントをマークします。Cocoa は、単にと呼ばれる最小限のファイルを使用していましたが、Xcode 6.1以降では、の実装で属性を使用していますUIApplicationDelegatemain.swiftmain.swiftNSApplicationMain@NSApplicationMainNSApplicationDelegate


4
新しいxcodeプロジェクトを作成しましたが、main.swiftどこにもファイルが見つかりません。このファイルの場所は何ですか?
セルビン、2014年

CocoaおよびCocoa Touch main.swiftでは、アプリケーションはSupporting Filesグループにあり、を呼び出すように構成されていますNSApplicationMain
ネイサン2014年

4
いいえ、サポートファイルグループにはありません。プロジェクトのどこにもありません。
セルビン、2014年

1
申し訳ありませんが、Cocoa Touchについては間違っていましたが、Cocoaについては正しいです。私の更新された回答を参照してください
nathan

もちろん、Cocoa Touchでもを作成して使用できますmain.swift
スルタン、2014年

40

AppDelegate.swiftファイルあなたが見ることができます@UIApplicationMain
AppDelegateは初期エントリファイルです。

基本的に:main.mAppDelegate.mちょっとSwiftだけにマージされますAppDelegate.swift


2
@nathan彼はiOS8にタグを付けました、それはに行きますCocoa-Touch、私の答えは正しいです。

いいですね、main.mを迅速に変更する方法を考えていましたが、1つしか見つかりませんでした。
Jalil、

28

ファイルと初期化を読むことをお勧めします

例外は、「main.swift」という名前の特別なファイルです。これは、プレイグラウンドファイルのように動作しますが、アプリのソースコードでビルドされます。「main.swift」ファイルにはトップレベルのコードを含めることができ、順序に依存するルールも適用されます。実際、「main.swift」で実行するコードの最初の行は、プログラムのメインエントリポイントとして暗黙的に定義されています。これにより、その行が「main.swift」にある限り、最小限のSwiftプログラムを1行にすることができます。

Xcodeでは、Macテンプレートのデフォルトは「main.swift」ファイルを含みますが、iOSアプリの場合、新しいiOSプロジェクトテンプレートのデフォルトは、@ UIApplicationMainを通常のSwiftファイルに追加することです。これにより、コンパイラはiOSアプリのメインエントリポイントを合成し、「main.swift」ファイルの必要性を排除します。

または、Objective-CからSwiftにプロジェクトを段階的に移行するときに一般的な、Objective-Cで記述されたmainの実装にリンクすることもできます。


3
これは、iOSでエントリポイントがどのように設定されているかを説明するための優れた方法であることがわかりました。
スティーブン

いい答えで、良いリンクです。次に、「早期」に実行する必要があるコードを配置するのに適した場所を見つけました。アプリデリゲートメソッドの1つを使用するのではなく、アプリデリゲートのinitをオーバーライドして、そこで実行します。たとえば、デフォルトのログレベルを設定するために使用しました。
チャールズ

1

Swiftアプリには属性があります:

  • @UIApplicationMain (ココアタッチ)
  • @NSApplicationMain (ココア)

これは、アプリケーションのエントリポイントがどこにあるかをSwiftコンパイラに伝えます。

迅速なコンパイラが内部で行うことは、main基本的にObjective-Cアプリと同じように見え、このメソッドをアプリのエントリポイント(アプリケーションプロセスの開始時に呼び出される最初のメソッド)として扱う関数を作成することです。

SwiftコンパイラーがMain属性を使用して行うこと、OSがアプリケーションのエントリーポイントがどこにあるかを知る方法について詳しく知りたい場合は、この記事を読むことをお勧めします:iOSアプリのエントリーポイントについて


1

Swift 5.3には、@mainプロジェクト内のエントリポイントの位置だけでなく、プロジェクト内の場所を制御できる新しい属性がありますmain.swift。メインエントリは1つしか存在できず、main.swiftファイルと属性を持つことはできません@main。詳細については、https://github.com/apple/swift-evolution/blob/master/proposals/0281-main-attribute.mdを参照してください。

@main
struct App {
    static func main() {
        print("Starting.")
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.