web-dev-qa-db-fra.com

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'ajouter ? à la fin de AppDelegate comme ci-dessous et l'erreur disparaît.

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 optional mot-clé pertinent pour cette erreur, sauf si je me trompe.

119
tranvutuan

L'erreur pourrait ê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 vous évite d'avoir à lui donner explicitement une valeur ou à l'initialiser.

231
drewag

Le Swift Langage de programmation indique:

Les classes et les structures doivent définir toutes les propriétés stockées sur une valeur initiale appropriée au moment de la création d'une instance de cette classe ou de cette structure. 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 attribuant une valeur de propriété par défaut dans le cadre de 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
    }

}
44
Imanou Petit

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

Par exemple

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

Selon ce que votre variable est censée faire, vous pouvez définir ce type de variable comme facultatif ou l'initialiser avec une valeur comme celle-ci.

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

Ce problème apparaît généralement lorsqu'une de vos variables n'a aucune valeur ou lorsque vous oubliez d'ajouter "!" pour forcer cette variable à stocker nil jusqu'à ce qu'elle soit définie.

Dans votre cas, le problème est ici:

var delegate: AppDelegate

Il doit être défini comme var delegate: AppDelegate! pour en faire une option qui stocke nil et ne décompresse pas la variable tant que la valeur n'est pas utilisée.

Il est regrettable que Xcode mette en évidence l’erreur de la classe entière au lieu de mettre en évidence la ligne de code qui l’a provoquée. Il faut donc un certain temps pour la comprendre.

12
Ivan V

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)
    }

}
10
saneryee

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

Le mot clé "facultatif" fait référence à l'utilisation de ?, voir this pour plus de détails.

3
user2118161

J'utilise Xcode 7 et Swift 2. Enfin, j'avais fait:

class ViewController: UIViewController {heure var: NSTimer // erreur ceci ici}

Ensuite, je répare: 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)
}

}

1
AmyNguyen

Pour moi était une déclaration incomplète. Par exemple:

var isInverted: Bool

Au lieu de la bonne façon:

var isInverted: Bool = false