web-dev-qa-db-fra.com

application (_: didFinishLaunchingWithOptions :) 'correspond presque à l'exigence facultative

Après avoir installé Xcode 8 beta 6, je reçois un avertissement disant:

La méthode d'instance 'application (_: didFinishLaunchingWithOptions :)' correspond presque à l'exigence facultative 'application (_: didFinishLaunchingWithOptions :)' du protocole 'UIApplicationDelegate'

dans mon délégué d'application.

Il existe 2 correctifs suggérés pour désactiver l'avertissement:

  1. Marquer la méthode comme privée
  2. Ajoutez @nonobjc à la méthode

Faire l'une ou l'autre fait taire l'avertissement. Mais pourquoi cela doit-il être fait?

27
doraemon

mise à jour du SDK iOS 12

Dans le SDK iOS 12 (fourni avec Xcode 10), UIApplicationLaunchOptionsKeya maintenant été renommé au type imbriqué UIApplication.LaunchOptionsKey, Vous aurez donc besoin de:

func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
    // ...
}

sDK iOS 10 et 11 (Xcode 8 et 9)

Cet avertissement est dû au fait que le paramètre didFinishLaunchingWithOptions: De la méthode déléguée application(_:didFinishLaunchingWithOptions:) est maintenant ponté vers Swift en tant que [UIApplicationLaunchOptionsKey: Any]?, Plutôt qu'un [NSObject : AnyObject]?.

Par conséquent, vous devrez mettre à jour votre implémentation pour refléter ce changement:

func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
) -> Bool {
    // ...
}

Notez qu'aucun des correctifs suggérés par Xcode ne résoudra réellement le problème, ils ne cacheront que votre implémentation de application(_:didFinishLaunchingWithOptions:) d'Objective-C - ce qui signifie qu'il ne sera jamais réellement appelé.

51
Hamish

le premier paramètre passé dans la fonction n'a plus de nom externe. Ce n'est vraiment qu'un détail mineur puisque vous n'appelez pas cette méthode directement, et c'est une solution rapide pour rendre le compilateur heureux. Vous pouvez soit modifier manuellement ce premier nom de paramètre en _, soit laisser Xcode s'en occuper à votre place.

func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool  

ou la nouvelle syntaxe

func application(_ application:UIApplication, 
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool // or remove = nil and try

vous pouvez obtenir la dernière documentation de Apple et un exemple de lien dans ici

3
Anbu.Karthik