web-dev-qa-db-fra.com

Sous-classe UIApplication avec Swift

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?

87
LombaX

[~ # ~] 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:

  • commenté @UIApplicationMain
  • ajouté un fichier main.Swift comme celui-ci (FLApplication est ma sous-classe).
    [~ # ~] important [~ # ~] le fichier DOIT ÊTRE NOMMÉ main.Swift, car les instructions de niveau supérieur ne sont pas prises en charge sur d'autres fichiers! Vous ne pouvez pas ajouter l'appel UIApplicationMain () à l'intérieur d'un autre fichier, sinon vous recevrez cette erreur:

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)
)
165
LombaX

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.

4
Cezar