La classe ‘ViewController’ n’a pas d’initialiseur dans swift

Obtenir la plainte du compilateur quand je le fais

class ViewController: UIViewController { var delegate : AppDelegate override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //self.appDelegate = UIApplication.sharedApplication().delegate; } @IBAction func getData(sender : AnyObject) { } @IBAction func LogOut(sender : AnyObject) { } } 

Cependant, si je viens d’append ? à la fin de AppDelegate comme ci-dessous et l’erreur a disparu.

 class ViewController: UIViewController { var delegate : AppDelegate? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //self.appDelegate = UIApplication.sharedApplication().delegate; } @IBAction func getData(sender : AnyObject) { } @IBAction func LogOut(sender : AnyObject) { } } 

Je ne vois pas de mot-clé optional correspondant à cette erreur sauf si je me trompe.

L’erreur peut être améliorée, mais le problème avec votre première version est que vous avez une variable membre, delegate , qui n’a pas de valeur par défaut. Toutes les variables de Swift doivent toujours avoir une valeur. Cela signifie que vous devez le configurer dans un initialiseur que vous n’avez pas ou vous pouvez lui fournir une valeur par défaut en ligne.

Lorsque vous le rendez facultatif, vous lui permettez d’être nil par défaut, ce qui évite de lui donner explicitement une valeur ou de l’initialiser.

Le langage de programmation rapide indique:

Les classes et les structures doivent définir toutes leurs propriétés stockées sur une valeur initiale appropriée au moment où une instance de cette classe ou structure est créée. Les propriétés stockées ne peuvent pas être laissées dans un état indéterminé.

Vous pouvez définir une valeur initiale pour une propriété stockée dans un initialiseur ou en atsortingbuant une valeur de propriété par défaut à la définition de la propriété.

Par conséquent, vous pouvez écrire:

 class myClass { var delegate: AppDelegate //non-optional variable init() { delegate = UIApplication.sharedApplication().delegate as AppDelegate } } 

Ou:

 class myClass { var delegate = UIApplication.sharedApplication().delegate as AppDelegate //non-optional variable init() { println("Hello") } } 

Ou:

 class myClass { var delegate : AppDelegate! //implicitly unwrapped optional variable set to nil when class is initialized init() { println("Hello") } func myMethod() { delegate = UIApplication.sharedApplication().delegate as AppDelegate } } 

Mais vous ne pouvez pas écrire ce qui suit:

 class myClass { var delegate : AppDelegate //non-optional variable init() { println("Hello") } func myMethod() { //too late to assign delegate as an non-optional variable delegate = UIApplication.sharedApplication().delegate as AppDelegate } } 

Parfois, cette erreur apparaît également lorsque vous avez un var ou un let qui n’a pas été initialisé.

Par exemple

 class ViewController: UIViewController { var x: Double // or var y: Ssortingng // or let z: Int } 

Selon ce que votre variable est censée faire, vous pouvez soit définir ce type de variable comme facultatif, soit l’initialiser avec une valeur similaire à la suivante.

 class ViewController: UIViewCOntroller { // Set an initial value for the variable var x: Double = 0 // or an optional Ssortingng var y: Ssortingng? // or let z: Int = 2 } 

Ce problème apparaît généralement lorsque l’une de vos variables n’a aucune valeur ou lorsque vous oubliez d’append “!” pour forcer cette variable à stocker nil jusqu’à ce qu’il soit défini.

Dans votre cas, le problème est ici:

 var delegate: AppDelegate 

Il devrait être défini comme var delegate: AppDelegate! pour en faire une option qui stocke nil et ne pas déballer la variable jusqu’à ce que la valeur soit utilisée.

Il est regrettable que Xcode mette en surbrillance la classe entière en tant qu’erreur au lieu de mettre en évidence la ligne de code qui l’a provoquée.

si vous avez perdu un “!” dans votre code, comme ce code ci-dessous, vous obtiendrez également cette erreur.

 import UIKit class MemeDetailViewController : UIViewController { @IBOutlet weak var memeImage: UIImageView! var meme:Meme! // lost"!" override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.memeImage!.image = meme.memedImage } override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) } } 

Remplacez var appDelegate : AppDelegate? avec let appDelegate = UIApplication.sharedApplication().delegate comme indiqué sur la deuxième ligne commentée dans viewDidLoad() .

Le mot clé “optionnel” se réfère exactement à l’utilisation de ? , voir ceci pour plus de détails.

J’utilise Xcode 7 et Swift 2. Enfin, j’ai créé:

class ViewController: UIViewController {var time: NSTimer // erreur ici}

Ensuite, je corrige: la classe ViewController: UIViewController {

 var time: NSTimer! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func viewWillAppear(animated: Bool) { //self.movetoHome() time = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(ViewController.movetoHome), userInfo: nil, repeats: false) //performSegueWithIdentifier("MoveToHome", sender: self) //presentViewController(<#T##viewControllerToPresent: UIViewController##UIViewController#>, animated: <#T##Bool#>, completion: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>) } func movetoHome(){ performSegueWithIdentifier("MoveToHome", sender: self) } 

}