Dans Objective C, c'était simple: il suffisait de mettre à jour le fichier main.m et de changer les paramètres UIApplicationMain ()
return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));
Mais dans Swift il n'y a pas de fichier main.m, puisque le guide dit
"Le code écrit à l'échelle mondiale est utilisé comme point d'entrée pour le programme, vous n'avez donc pas besoin d'une fonction principale."
Alors, comment sous-classer UIApplication dans swift ?? Toute suggestion?
[~ # ~] note [~ # ~] la syntaxe a été mise à jour pour XCode 10.1 et Swift 5 in Juin 2019 (crédits à la réponse de Matt ici && la réponse de Tung Fam ici ), si vous recherchez les syntaxes précédentes, regardez la section d'édition.
Ok, j'ai trouvé la solution
Tout d'abord, j'ai remarqué que, en haut du fichier AppDelegate.Swift, il y a cette ligne
@UIApplicationMain
Étant donné que cette ligne est en dehors de toute portée (c'est au niveau du fichier), elle est exécutée immédiatement et je suppose que le compilateur la traduit dans une fonction principale standard.
Donc, je l'ai fait, à partir d'une nouvelle application Swift-Only:
@UIApplicationMain
Les expressions ne sont pas autorisées au niveau supérieur
Ceci est le fichier principal.Swift
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv,
NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self)
)
Ensuite, créez un fichier Swift pour la sous-classe UIApplication, FLApplication.Swift, avec ce code:
import UIKit
import Foundation
class FLApplication: UIApplication {
override func sendEvent(_ event: UIEvent) {
super.sendEvent(event)
print("send event")
}
}
maintenant, UIApplication est correctement sous-classé et vous verrez les messages "envoyer un événement" dans le journal
ANCIENNES MODIFICATIONS
Pour référence, comme cela a beaucoup changé de la version 1 à la version 3, je laisse ici toutes les éditions précédentes
EDIT - MARS 2015
Comme l'a commenté Hu Junfeng, les explications sur UIApplicationMain
et le fichier main.Swift sont documentées dans la section Attributes de la Swift Référence du langage: Lien
Comme l'a commenté Thomas Verbeek Dans la version bêta de XCode 6.3, vous constaterez peut-être que C_ARGC et C_ARGV ont été renommés Process.argc et Process.unsafeArgv respectivement. Votre appel UIApplicationMain dans le fichier main.Swift devra être mis à jour pour:
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
La syntaxe pré-XCode 8 était
import Foundation
import UIKit
UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
EDIT - DEC 2016
Solution pour Xcode 8, avant la beta 6
import Foundation
import UIKit
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
NSStringFromClass(FLApplication.self),
NSStringFromClass(AppDelegate.self)
)
Une alternative consiste à étendre UIApplication
au lieu de le sous-classer. Selon le iBook publié par Apple, les extensions de Swift peuvent:
Ajouter des propriétés calculées et des propriétés statiques calculées Définir des méthodes d'instance et des méthodes de type Fournir de nouveaux initialiseurs Définir des indices Définir et utiliser de nouveaux types imbriqués Rendre un type existant conforme à un protocole
Extrait de: Apple Inc. “The Swift Programming Language.
Si vos besoins en sous-classe UIApplication
sont satisfaits par ces capacités, une extension pourrait être la voie à suivre.