我不明白Swift中的nil

时间:2017-12-26 04:51:24

标签: ios swift crash

我之前曾尝试阅读过很多帖子,但我似乎仍然无法理解" nil"。

let mass = Double(density! * volume!)

在代码的这一部分,它告诉我:

  

"线程1:致命错误:在展开可选值时出乎意料地发现nil"

当我运行我的应用程序时,如果我没有按下按钮,而所有文本字段都为空,但是当我这样做时崩溃并且调试工具告诉我错误在这里但是我在不知道为什么它不起作用。
我真的不明白Stack Overflow和Swift上的其他零解释论坛对我来说非常困惑。

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

2 个答案:

答案 0 :(得分:2)

应用崩溃是因为densityvolume都是nil。如果您强制解包nil(使用!),您的应用会崩溃。

为什么densityvolume无效?

由于Double初始化工具返回nil

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

这是由您传递给它的字符串格式错误引起的。 densityInput.textvolumeInput.text不是有效的双字符串。为什么他们无效?好吧,正如你所说,文本字段是空的。空字符串("")无法转换为双字符串。

要解决此问题,如果其中一个文本字段无效,您可以选择不进行计算:

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

如果其中一个是nil,则表示不会运行。

也为所有其他计算执行此操作!

答案 1 :(得分:0)

是的,您的问题本身的答案将会崩溃

您将此作为按钮操作

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

第1步 clearAnswer()的执行情况良好因为您只是清除文本字段

第2步关于mvdCalc()执行

let mass = Double(density! * volume!)

App崩溃了 - 请看下面的截图

enter image description here

如果您看到密度值已打印到控制台,则densityStr不是“”

打印质量产生错误,因为massStr是“”

所以,要解决你需要在调用函数之前检查以计算值

<强>作为

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

注意:在未执行计算之前,请勿清除TF值

其次,不要调用mvdCalc(),直到此块的所需TF为空

显示警告按钮按下“需要此TF值”且条件满足执行 mvdCalc()