2017-12-26 4 views
-1

Ich habe versucht, auf viele der Beiträge vor lesen, aber ich scheint immer noch nicht in der Lage zu "Nil" zu verstehen.Ich bin neu in der Codierung und ich verstehe nicht

let mass = Double(density! * volume!) 

In diesem Abschnitt des Codes es mir erzählt „Thread 1: Fatal error: gefunden unerwartet null, während ein optionaler Wert auspackt“. Wenn ich meine App laufe, läuft es reibungslos, wenn ich nicht auf den Knopf drücke, während alle Textfelder leer sind, aber wenn ich es tue, stürzt es ab und das Debugger-Tool sagt mir, dass der Fehler hier ist, aber ich bin nicht sicher, warum es nicht tut Arbeit.
Sorry, wenn dies eine Frage ist, die ich wiederhole, verstehe ich einfach nicht die anderen nil Erklärung Foren auf Stackover Flow und Swift ist sehr verwirrend für mich, wie es ist.

import UIKit 
class ViewController: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var massInput: UITextField! 
@IBOutlet weak var volumeInput: UITextField! 
@IBOutlet weak var densityInput: UITextField! 
@IBOutlet weak var answerOutput: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 

} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.view.endEditing(true) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

@IBAction func calculateButton(_ sender: UIButton) { 
    clearAnswer() 
    mvdCalc() 
    clearBoxes() 
}//end of btn 

//------------------------FUNCTIONS----------------------------------- 

func mvdCalc(){ 
    if massInput.text!.isEmpty {massFormula()} 
    if volumeInput.text!.isEmpty {volumeFormula()} 
    if densityInput.text!.isEmpty {densityFormula()} 
}//end of mvdCalc 

func clearBoxes(){ 
    massInput.text = "" 
    volumeInput.text = "" 
    densityInput.text = "" 
}//end of clear boxes 

func massFormula(){ 
    let density = Double(densityInput.text!) 
    let volume = Double(volumeInput.text!) 
    let mass = Double(density! * volume!) 
    answerOutput.text = "\(mass)" 
}//end of mass 

func volumeFormula(){ 
    let density = Double(densityInput.text!) 
    let mass = Double(massInput.text!) 
    let volume = Double(mass!/density!) 
    answerOutput.text = "\(volume)" 
}//end of volume 

func densityFormula(){ 
    let volume = Double(volumeInput.text!) 
    let mass = Double(massInput.text!) 
    let density = Double(mass!/volume!) 
    answerOutput.text = "\(density)" 
}//end of density 

func clearAnswer() { 
    if massInput.text == "" && volumeInput.text == "" && densityInput.text == "" { 
     answerOutput.text = "" 
    } 
}//end of clearAnswer 

}//end of class 
+0

https://stackoverflow.com/questions/24496830/difference-between-and-in-swift-language – Niroj

Antwort

2

Die App stürzt ab, weil beide density und volumenil sind. Wenn Sie eine nil (mithilfe der !) erzwingen, stürzt Ihre App ab.

Warum sind density und volume null dann?

Da die Double initialisers hier zurück nil:

let density = Double(densityInput.text!) 
let volume = Double(volumeInput.text!) 

Dies wird durch die Saiten verursacht Sie es in einem falschen Format ist vergangen. densityInput.text und volumeInput.text sind keine gültigen doppelten Zeichenketten. Warum sind sie nicht gültig? Nun, wie du gesagt hast, die Textfelder sind leer. Leere Zeichenfolgen ("") können nicht in ein Double konvertiert werden.

Um dies zu beheben, können Sie wählen, um die Berechnung nicht tun, wenn entweder eines der Textfelder nicht gültig sind:

if let density = Double(densityInput.text!), let volume = Double(volumeInput.text!) { 
    let mass = density * volume 
    answerOutput.text = "\(mass)" 
} 

Wenn entweder nil ist, wird das, wenn nicht ausgeführt werden.

Tun Sie dies auch für alle anderen Berechnungen!

+0

Vielen Dank habe ich es funktioniert, danke für die Erklärung, ich schätze es wirklich! –

0

Ja Anwendung wird von Gängen Antworten in Frage abstürzen selbst

Sie rufen diese als Schaltfläche Aktion

@IBAction func calculateButton(_ sender: UIButton) { 
    clearAnswer() 
    mvdCalc() 
    clearBoxes() 
} 

Schritt 1 Durchführung von clearAnswer() Passt Weil Sie nur Ihre Clearing Textfelder

Schritt 2 Wenn es darum geht, mvdCalc() Ausführung

let mass = Double(density! * volume!) 

App abgestürzt hier - Blick auf den folgenden Screenshot

enter image description here

wenn Sie Dichtewert sehen Printed zu trösten sind densityStr nicht ""

und

war

Druckmasse Es wurde ein Fehler ausgegeben, weil "massenstr"

war So

, lösen Sie vor dem Aufruf Funktion überprüfen müssen Werte berechnen

als

if mass != nil { 
    print("call function") 
    let massValue = Double(density! * volume!) 
    answerOutput.text = "\(massValue)" 
} 
else{ 
    print("Value is empty no calculation to be performed") 
} 

Hinweis: löschen Sie den TF Werte nicht, bis Sie Ihre Berechnung nicht durchgeführt hatte

Zweitens: Rufen Sie nicht mvdCalc() an, bis die erforderliche TF für diesen Block leer ist.

Zeigen Sie die Warnung an, und drücken Sie auf "Wert für diese TF "erforderlich ist und wenn die Bedingung Ausführen Zufrieden mvdCalc()

Verwandte Themen