web-dev-qa-db-fra.com

Xcode 8 beta 6: main.Swift ne compile pas

Nous avons un objet UIApplication personnalisé, donc notre main.Swift était

import Foundation
import UIKit

UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MobileUIApplication), NSStringFromClass(AppDelegate))

et cela n'a pas fonctionné dans Xcode 8 beta 5, nous avons donc utilisé cette

//TODO Swift 3 workaround? https://forums.developer.Apple.com/thread/46405
UIApplicationMain( Process.argc, UnsafeMutablePointer<UnsafeMutablePointer<CChar>>(Process.unsafeArgv), nil, NSStringFromClass(AppDelegate.self))

Sur Xcode 8 beta 6, nous obtenons tilisation de l'identifiant non résolu 'Processus'

Que devons-nous faire dans Xcode 8 beta 6/Swift 3 pour définir l'UIApplicationMain?

23
Jason Hocker

Je l'écris de cette façon:

UIApplicationMain(
    CommandLine.argc,
    UnsafeMutableRawPointer(CommandLine.unsafeArgv)
        .bindMemory(
            to: UnsafeMutablePointer<Int8>.self,
            capacity: Int(CommandLine.argc)),
    nil,
    NSStringFromClass(AppDelegate.self)
)

Pour modifier la classe UIApplication, remplacez NSStringFromClass(MobileUIApplication.self) par nil dans cette formulation.

Cependant, si votre seul but ici est de remplacer une sous-classe UIApplication comme instance d'application partagée, il existe un moyen plus simple: dans le Info.plist , ajoutez la clé "Classe principale" et définissez sa valeur sur le nom de chaîne de votre sous-classe UIApplication, et marquez votre déclaration de cette sous-classe avec un @objc(...) attribut lui donnant le même nom Objective-C.

EDIT Ce problème est maintenant résolu dans Swift 4.2. CommandLine.unsafeArgv a maintenant la signature correcte et une peut appeler UIApplicationMain facilement:

UIApplicationMain(
    CommandLine.argc, CommandLine.unsafeArgv, 
    nil, NSStringFromClass(AppDelegate.self)
)
57
matt

Il semble que Process a été renommé CommandLine dans la version bêta 6.

CommandLine

Mais le type de CommandLine.unsafeArgv ne correspond pas au deuxième argument de UIApplication, vous devrez donc peut-être écrire quelque chose comme ceci:

CommandLine.unsafeArgv.withMemoryRebound(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)) {argv in
    _ = UIApplicationMain(CommandLine.argc, argv, NSStringFromClass(MobileUIApplication.self), NSStringFromClass(AppDelegate.self))
}

(MISE À JOUR) Cette incompatibilité doit être considérée comme un bogue. En règle générale, vous feriez mieux d'envoyer un rapport de bogue lorsque vous trouvez des choses "cela ne devrait pas être", comme le troisième paramètre de la bêta 5. J'espère que ce "bogue" sera bientôt corrigé.


Si vous souhaitez simplement désigner votre classe UIApplication personnalisée, pourquoi n'utilisez-vous pas Info.plist?

NSPrincipalClass | String | $(PRODUCT_MODULE_NAME).MobileUIApplication

(Affiché comme "Classe principale" dans la vue Clés/Valeurs non brutes.)

Avec ceci dans votre Info.plist, vous pouvez utiliser votre MobileUIApplication de manière normale en utilisant @UIApplicationMain.

(ADDITION) En-tête doc de UIApplicationMain:

// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.
5
OOPer