我是编码的新手,我不明白为零

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我是编码的新手,我不明白为零相关的知识,希望对你有一定的参考价值。

我曾尝试阅读过很多帖子,但我似乎仍然无法理解“无”。

let mass = Double(density! * volume!)

在代码的这一部分,它告诉我“线程1:致命错误:在展开Optional值时意外发现nil”。当我运行我的应用程序时它运行顺利,如果我没有按下按钮,而所有的文本字段都是空的,但当我这样做崩溃和调试工具告诉我错误在这里,但我不知道为什么它不工作。 很抱歉,如果这是一个重复的问题,我真的不明白其他nil解释论坛上的stackover flow和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 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
答案

该应用程序崩溃,因为densityvolume都是nil。如果您强制解开nil(使用!),您的应用程序崩溃。

那为什么densityvolume呢?

因为这里的Double初始化者返回了nil

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

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

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

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

如果要么是nil,那么if将不会运行。

这样做也适用于所有其他计算!

另一答案

是的应用程序将在您的问题本身中崩溃当然的答案

您将此称为按钮操作

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

步骤1执行clearAnswer()顺利完成因为您只是清除文本字段

第2步说到mvdCalc()执行

let mass = Double(density! * volume!)

应用程序崩溃了 - 请看下面的截图

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

以上是关于我是编码的新手,我不明白为零的主要内容,如果未能解决你的问题,请参考以下文章

Android - IllegalStateException:地图大小为零

*** Bool 编码为数字属性列表片段。属性列表编码器

成功上传文件后,来自 Firebase 存储的 downloadURL 为零

使用 Kotlin 更改片段中的按钮背景

CSS媒体查询(媒体屏幕)[关闭]

我想在我的应用中设置本地通知