Was ist der Einstiegspunkt für die schnelle Codeausführung?

105

Es gibt keine main()Methode in Swift. Das Programm muss die Ausführung von irgendwo aus starten. Was ist der Einstiegspunkt für die schnelle Codeausführung und wie wird entschieden?

Selvin
quelle

Antworten:

94

Der Einstiegspunkt in ein einfaches Swift-Modul ist die Datei im aufgerufenen Modul main.swift. main.swiftist die einzige Datei, die Ausdrücke und Anweisungen auf der obersten Ebene enthalten darf (alle anderen Swift-Dateien im Modul können nur Deklarationen enthalten).

Cocoa Touch verwendet das @UIApplicationMainAttribut für eine Implementierung von UIApplicationDelegateanstelle einer main.swiftDatei, um den Einstiegspunkt zu markieren. Cocoa verwendete früher eine minimale main.swiftDatei, die einfach aufgerufen wurde NSApplicationMain, aber ab Xcode 6.1 wird das @NSApplicationMainAttribut für eine Implementierung von verwendet NSApplicationDelegate.

Nathan
quelle
4
Ich habe ein neues xcode-Projekt erstellt und main.swiftkann nirgendwo eine Datei finden. Wo befindet sich diese Datei?
Selvin
In Cocoa und Cocoa Touch befinden sich Anwendungen main.swiftin der Gruppe " Unterstützende Dateien " und werden einfach zum Aufrufen konfiguriert NSApplicationMain.
Nathan
4
Nein, es ist nicht in der Gruppe "Unterstützende Dateien" vorhanden. Es ist nirgendwo im Projekt.
Selvin
1
Entschuldigung, ich habe mich in Bezug auf Cocoa Touch geirrt, aber in Bezug auf Cocoa richtig. Siehe meine aktualisierte Antwort
Nathan
Natürlich können Sie auch in Cocoa Touch erstellen und verwenden main.swift.
Sulthan
40

In der AppDelegate.swiftDatei können Sie sehen @UIApplicationMain.
Das AppDelegate ist die erste Eingabedatei.

Grundsätzlich: main.mund AppDelegate.msind irgendwie Swiftzu nur verschmolzenAppDelegate.swift


quelle
2
@nathan Er markiert iOS8 , die für geht Cocoa-Touch, ist meine Antwort richtig.
Schön, ich habe mich gefragt, wie ich main.m schnell ändern kann, und ich habe nichts gefunden.
Jalil
28

Möglicherweise möchten Sie Dateien und Initialisierung lesen

Die Ausnahme ist eine spezielle Datei mit dem Namen "main.swift", die sich ähnlich wie eine Spielplatzdatei verhält, jedoch mit dem Quellcode Ihrer App erstellt wird. Die Datei "main.swift" kann Code der obersten Ebene enthalten, und die auftragsabhängigen Regeln gelten ebenfalls. Tatsächlich wird die erste Codezeile, die in „main.swift“ ausgeführt wird, implizit als Haupteinstiegspunkt für das Programm definiert. Dadurch kann das minimale Swift-Programm eine einzelne Zeile sein - solange sich diese Zeile in „main.swift“ befindet.

In Xcode enthalten Mac-Vorlagen standardmäßig eine Datei "main.swift". Bei iOS-Apps wird bei neuen iOS-Projektvorlagen standardmäßig @UIApplicationMain zu einer regulären Swift-Datei hinzugefügt. Dies veranlasst den Compiler, einen Haupteinstiegspunkt für Ihre iOS-App zu synthetisieren, und macht die Datei "main.swift" überflüssig.

Alternativ können Sie eine in Objective-C geschriebene Implementierung von main verknüpfen, die bei der schrittweisen Migration von Projekten von Objective-C nach Swift üblich ist.

onmyway133
quelle
3
Ich fand, dass dies eine viel bessere und übergeordnete Erklärung dafür ist, wie der Einstiegspunkt in iOS eingerichtet ist.
Steven
Schöne Antwort und guter Link. Ich habe dann einen guten Platz gefunden, um Code zu platzieren, der "früh" ausgeführt werden muss. Anstatt eine der App-Delegat-Methoden zu verwenden, überschreibe ich einfach init auf dem App-Delegaten und mache es dort. Ich habe es zB verwendet, um die Standardprotokollierungsstufe einzurichten.
Charles
1

In Swift-Apps gibt es Attribute:

  • @UIApplicationMain (Cocoa Touch)
  • @NSApplicationMain (Kakao)

das teilt dem schnellen Compiler mit, wo sich der Einstiegspunkt der Anwendung befindet.

Was der schnelle Compiler unter der Haube macht, ist, dass er eine erstellt main Funktion erstellt, die im Grunde genommen genauso aussieht wie in Objective-C-Apps und diese Methode als Einstiegspunkt der App behandelt (eine erste Methode, die beim Starten des Anwendungsprozesses aufgerufen wird).

Wenn Sie mehr darüber erfahren möchten, was der schnelle Compiler mit MainAttributen macht und wie das Betriebssystem weiß, wo sich der Einstiegspunkt der Anwendung befindet, empfehlen wir Ihnen, diesen Artikel zu lesen: Grundlegendes zum Einstiegspunkt für iOS- Apps

Bartosz Olszanowski
quelle
1

In Swift 5.3 gibt es ein neues @mainAttribut, mit dem Sie steuern können, wo sich Ihr Einstiegspunkt in Ihrem Projekt befindet und nicht nur main.swift. Es kann nur einen Haupteintrag geben und Sie können keine main.swiftDatei und kein Attribut haben @main. Weitere Informationen finden Sie unter https://github.com/apple/swift-evolution/blob/master/proposals/0281-main-attribute.md .

@main
struct App {
    static func main() {
        print("Starting.")
    }
}
possen
quelle