Quel est le point d'entrée de l'exécution du code SWIFT?

105

Il n'y a pas de main()méthode dans Swift. Le programme doit démarrer l'exécution de quelque part. Alors, quel est le point d'entrée de l'exécution du code Swift et comment est-il décidé?

Selvin
la source

Réponses:

94

Le point d'entrée dans un module Swift simple est le fichier dans le module appelé main.swift. main.swiftest le seul fichier autorisé à avoir des expressions et des instructions au niveau supérieur (tous les autres fichiers Swift du module ne peuvent contenir que des déclarations).

Cocoa Touch utilise l' @UIApplicationMainattribut sur une implémentation de UIApplicationDelegateau lieu d'un main.swiftfichier pour marquer le point d'entrée. Cocoa utilisait un main.swiftfichier minimal qui appelait simplement NSApplicationMain, mais à partir de Xcode 6.1 utilise l' @NSApplicationMainattribut sur une implémentation de NSApplicationDelegate.

Nathan
la source
4
J'ai créé un nouveau projet xcode et je ne peux pas trouver de main.swiftfichier nulle part. Quel est l'emplacement de ce fichier?
Selvin
Dans les applications Cocoa et Cocoa Touch se main.swifttrouve dans le groupe Fichiers de prise en charge et est simplement configuré pour appeler NSApplicationMain.
nathan
4
Non, ce n'est pas là dans le groupe Fichiers de prise en charge. Ce n'est nulle part dans le projet.
Selvin
1
Désolé, je me suis trompé à propos de Cocoa Touch mais correct à propos de Cocoa. Voir ma réponse mise à jour
nathan
Bien sûr, même dans Cocoa Touch, vous pouvez créer et utiliser main.swift.
Sulthan
40

Dans le AppDelegate.swiftfichier, vous pouvez voir @UIApplicationMain.
L'AppDelegate est le fichier d'entrée initial.

En gros: main.met AppDelegate.msont un peu fusionné dans SwiftjusteAppDelegate.swift


la source
2
@nathan Il a tagué iOS8 , c'est vraiCocoa-Touch , ma réponse est juste.
Bien, je me demandais comment pourrais-je changer main.m en swift et je n'ai rien trouvé.
Jalil
28

Vous voudrez peut-être lire les fichiers et l'initialisation

L'exception est un fichier spécial nommé «main.swift», qui se comporte un peu comme un fichier de jeu, mais est construit avec le code source de votre application. Le fichier «main.swift» peut contenir du code de niveau supérieur et les règles dépendant de l'ordre s'appliquent également. En effet, la première ligne de code à exécuter dans «main.swift» est implicitement définie comme le point d'entrée principal du programme. Cela permet au programme Swift minimal d'être une seule ligne - tant que cette ligne est dans «main.swift».

Dans Xcode, les modèles Mac incluent par défaut un fichier «main.swift», mais pour les applications iOS, la valeur par défaut pour les nouveaux modèles de projet iOS consiste à ajouter @UIApplicationMain à un fichier Swift normal. Cela amène le compilateur à synthétiser un point d'entrée principal pour votre application iOS et élimine le besoin d'un fichier «main.swift».

Vous pouvez également créer un lien dans une implémentation de main écrite en Objective-C, courante lors de la migration incrémentielle de projets d'Objective-C vers Swift.

onmyway133
la source
3
J'ai trouvé que c'était une explication meilleure et de niveau supérieur de la configuration du point d'entrée dans iOS.
Steven
Bonne réponse et bon lien. J'ai alors trouvé un bon endroit pour mettre du code qui doit s'exécuter "tôt". Plutôt que d'utiliser l'une des méthodes de délégué d'application, je remplace simplement init sur le délégué d'application et je le fais ici. Je l'ai utilisé par exemple pour configurer le niveau de journalisation par défaut.
charles
1

Dans les applications Swift, il existe des attributs:

  • @UIApplicationMain (Touche de cacao)
  • @NSApplicationMain (Cacao)

qui indiquent au compilateur Swift où est le point d'entrée de l'application.

Ce que le compilateur rapide fait sous le capot, c'est qu'il crée une mainfonction, qui ressemble fondamentalement à celle des applications Objective-C et traite cette méthode comme le point d'entrée de l'application (une première méthode appelée lorsque le processus d'application est démarré).

Si vous souhaitez en savoir plus sur ce que fait le compilateur rapide avec les Mainattributs, comment le système d'exploitation sait où se trouve le point d'entrée de l'application, je vous encourage à lire cet article: Comprendre le point d'entrée de l'application iOS

Bartosz Olszanowski
la source
1

Dans Swift 5.3, il existe un nouvel @mainattribut qui vous permet de contrôler où se trouve votre point d'entrée dans votre projet plutôt que simplement main.swift. Il ne peut y avoir qu'une seule entrée principale et vous ne pouvez pas avoir de main.swiftfichier et un attribut @main. Voir https://github.com/apple/swift-evolution/blob/master/proposals/0281-main-attribute.md pour plus de détails.

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