2017-05-05 1 views
-3

Je reçois l'erreur:Comment puis-je résoudre l'erreur « classe appDelegate n'a pas initialisations »

Class AppDelegate has no initializers

et ne peut pas l'air de comprendre pourquoi. Je suis le this tutorial. Je suis un débutant donc toute aide serait très appréciée!

Mon code:

import UIKit 

@UIApplicationMain 

class AppDelegate: UIResponder, UIApplicationDelegate { 
    var window: UIWindow? 
    var centerContainer: MMDrawerController 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // Override point for customization after application launch. 

     _ = self.window!.rootViewController 

     let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 

     let centerViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 

     let leftViewController = mainStoryboard.instantiateViewController(withIdentifier: "LeftSideViewController") as! LeftSideViewController 

     let leftSideNav = UINavigationController(rootViewController: leftViewController) 
     let centerNav = UINavigationController(rootViewController: centerViewController) 


     centerContainer = MMDrawerController(center: centerNav, leftDrawerViewController: leftSideNav) 


     centerContainer.openDrawerGestureModeMask = MMOpenDrawerGestureMode.panningCenterView; 

     centerContainer.closeDrawerGestureModeMask = MMCloseDrawerGestureMode.panningCenterView; 

     window!.rootViewController = centerContainer 
     window!.makeKeyAndVisible() 

     return true 
    } 
} 
+0

Est-ce que 'centerContainer' doit être une propriété? Est-ce que ce sera l'accès à partir d'un autre code en plus de la méthode 'didFinishLaunchingWithOptions'? – rmaddy

+2

Possible doublon de [Classe n'a pas initialiseurs Swift] (http://stackoverflow.com/questions/27797351/class-has-no-initializers-swift) –

Répondre

0

Essayez de changer votre propriété centerContainer à un en option comme ceci:

var centerContainer: MMDrawerController! 

en tant que tel, il sera initialisé avec nil, qui devrait être assez le supprimer l'erreur que vous rencontrez (Soit dit en passant, vous ne devriez pas besoin de changer le reste de votre code en conséquence.)

De The Swift Programming Language livre:

Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties cannot be left in an indeterminate state.

+0

Merci, cela a été très utile! – Acer

+0

@Acer Vous êtes les bienvenus! Et bienvenue à SO en passant :) –

2

Depuis centerContainer n'est pas une option et n'est pas donné une Par défaut, Swift s'attend à ce qu'une fonction d'initialisation lui en donne une. Il y a quelques solutions possibles ici:

  1. Donnez-lui une valeur par défaut. Probablement pas pratique dans ce contexte.
  2. Rend facultatif. Cela fonctionnerait, mais en fonction de la façon dont il est utilisé, cela pourrait ajouter beaucoup de déballage inutile à votre code.
  3. Faites-en une option implicitement déballée. C'est essentiellement dire "Je ne peux pas/je ne veux pas donner une valeur par défaut ou le mettre dans un initialiseur, mais je vais certainement lui donner une valeur avant de l'utiliser pour quelque chose." Habituellement, l'option la plus propre pour des choses comme celle-ci, faites juste attention à ne pas l'assigner nil plus tard dans votre code ou les choses vont se casser.
0

Rendez votre centerContainer var optionnel comme window. Dans Swift, toutes les propriétés doivent être initialisées. Lorsque vous rendez votre variable facultative, vous l'initialisez en tant que nil.

var centerContainer: MMDrawerController? 
+0

L'utilisation d'un * implicitement déballé * facultatif ici (c'est-à-dire, 'MMDrawerController!') Pourrait être un meilleur ajustement ici. Voir ma réponse ci-dessous. –

+0

@PauloMattos Oui! C'est tout à fait vrai. Mais comme l'OP avait quelques connaissances de base sur 'optionnel '(il en avait utilisé un comme' window'), j'espère que le fait de ne pas se vanter de plus de concept (c'est-à-dire' implicite optionnel') serait bon pour lui. – nayem

+1

Bon point homme, je suis d'accord! Un * surcharge de concepts * - un comportement commun sur SO, pourrait-on dire - pourrait l'effrayer. Parfois, vous devez apprendre un tour à la fois :) –