2014-09-12 4 views
103

die Beschwerde vom Compiler bekommen, wenn ich dieseKlasse ‚Viewcontroller‘ hat keinen initializers in schnellen

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

jedoch tue, wenn ich nur noch hinzufügen? am Ende der AppDelegate wie unten und der Fehler ist weg.

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

Ich sehe auf diesen Fehler nicht optional Schlüsselwort relevant, wenn ich falsch bin.

Antwort

200

Der Fehler könnte verbessert werden, aber das Problem mit Ihrer ersten Version ist eine Membervariable delegate, die keinen Standardwert hat. Alle Variablen in Swift müssen immer einen Wert haben. Das bedeutet, dass Sie es in einem Initialisierer einrichten müssen, den Sie nicht haben, oder Sie könnten ihm einen Standardwert inline bereitstellen.

Wenn Sie es als optional festlegen, lassen Sie es standardmäßig nil zu. Dadurch müssen Sie nicht explizit einen Wert angeben oder initialisieren.

+10

Schreckliche Fehler Syntax imo – Magoo

+0

code bitte, code erklärt – Martian2049

3

Ersetzen Sie var appDelegate : AppDelegate? durch let appDelegate = UIApplication.sharedApplication().delegate wie auf der zweiten kommentierten Linie in viewDidLoad() angedeutet. Das Schlüsselwort "optional" bezieht sich genau auf die Verwendung von ?, siehe this für weitere Details.

38

Die Swift-Programmiersprache Zustände:

Klassen und Strukturen müssen alle ihre gespeicherten Eigenschaften zu einem geeigneten Anfangswert durch die Zeit, eine Instanz dieser Klasse oder Struktur gesetzt wird erstellt. Gespeicherte Eigenschaften können nicht in einem unbestimmten Zustand verlassen werden.

Sie können einen Initialwert für eine gespeicherte Eigenschaft in einem Initializer festlegen oder indem Sie einen Standardeigenschaftswert als Teil der Definition der Eigenschaft zuweisen.

Daher können Sie schreiben:

class myClass { 

    var delegate: AppDelegate //non-optional variable 

    init() { 
     delegate = UIApplication.sharedApplication().delegate as AppDelegate 
    } 

} 

Oder:

class myClass { 

    var delegate = UIApplication.sharedApplication().delegate as AppDelegate //non-optional variable 

    init() { 
     println("Hello") 
    } 

} 

Oder:

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 
    } 

} 

Aber Sie folgende nicht schreiben können:

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 
    } 

} 
10

Dieses Problem tritt normalerweise auf, wenn eine Ihrer Variablen keinen Wert hat oder wenn Sie vergessen, "!" um zu erzwingen, dass diese Variable null speichert, bis sie gesetzt ist.

In Ihrem Fall ist das Problem hier:

var delegate: AppDelegate 

Es sollte als var delegate: AppDelegate! definiert werden, es zu machen, eine optionale, dass Geschäfte nil und auspacken nicht die Variable, bis der Wert verwendet wird.

Es ist traurig, dass Xcode die ganze Klasse als Fehler hervorhebt, anstatt die spezielle Codezeile zu markieren, die sie verursacht hat. Es dauert also eine Weile, um es herauszufinden.

+0

Dies beseitigt die Fehlermeldung für mich im Falle eines IBOutlet, aber nicht im Falle einer Standardvariablen. –

+0

Das löst mein Problem. Als ich das versuchte: var holeResultsController: NSFetchedResultsController Ich habe den Kompilierfehler bekommen. Beim Hinzufügen "!" Der Fehler ist weg, wie so var abgerufenResultsController: NSFetchedResultsController! – Jervisbay

+0

danke für deine ur ans! Das ist hilfreich für mich, ich habe nur "?" zu optionalem Wert aber "!" Ich habe es vorher nicht gewusst. Ich setze "!" so: var time: NSTimer! – AmyNguyen

1

verwende ich Xcode 7 und Swift 2. Last, die ich gemacht hatte:

Klasse Viewcontroller: UIViewController { var Zeit: NSTimer // Fehler dies hier }

Dann habe ich fix: Klasse 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) 
} 

}

+0

Die Klarheit ist nicht ganz in Ihrer Antwort, aber das war mein Problem; Ich habe die Option eines Mitglieds var nicht angegeben (forced/optional); Sobald ich das getan habe und den Code später angepasst habe, hat ViewController nicht mehr darüber geklagt, dass er keinen Initialisierer hat. –

+0

Sie haben das Problem gelöst? – AmyNguyen

6

, wenn Sie verloren ein "!" in Ihrem Code, wie dieser Code unten, erhalten Sie auch diesen Fehler.

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

} 
+0

Danke @saneryee, es ist so lächerlich Fehler :) – mgyky

17

Manchmal erscheint dieser Fehler auch, wenn Sie eine Var oder ein Let haben, die nicht initialisiert wurde.

Zum Beispiel

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

Je nachdem, was Ihre Variable soll Sie setzen könnte tun, dass entweder var Typ als optionale oder initialisieren es mit einem Wert wie folgt

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 
} 
+0

Also was ist die Lösung dafür? – Martian2049

+0

können sie stattdessen in einer init-Funktion initiert werden? – Martian2049

Verwandte Themen