xCode解开可选内容时发现nil,即使对其进行了检查

如何解决xCode解开可选内容时发现nil,即使对其进行了检查

非常基本的代码

我在学校做编码,必须创建一个应用程序。该应用程序的一部分是用水量计算器。即使我正在从可选对象中检查nil值,它也会收到错误:“致命错误:在展开可选对象时意外发现了nil”。它会在func btncalculate的随​​机部分期间发现此错误

import UIKit

class WaterCalcViewController: UIViewController {
    
    
    //Inputs
    @IBOutlet weak var txtShowers: UITextField!
    @IBOutlet weak var txtBaths: UITextField!
    @IBOutlet weak var txtdishwasher: UITextField!
    @IBOutlet weak var txtWashingMachine: UITextField!
    @IBOutlet weak var txtTeeth: UITextField!
    @IBOutlet weak var txtToilet: UITextField!
    @IBOutlet weak var txtNumOfPeople: UITextField!
    //Inputs for the user to add values to their respective use of each item/thing
    
    //Outputs
    
    
    @IBOutlet weak var lblShowerError: UILabel!
    @IBOutlet weak var lblBathError: UILabel!
    @IBOutlet weak var lbldishwasherError: UILabel!
    @IBOutlet weak var lblWashingMachineError: UILabel!
    @IBOutlet weak var lblTeethError: UILabel!
    @IBOutlet weak var lblToiletError: UILabel!
    @IBOutlet weak var lblNumOfPeopleError: UILabel!
    @IBOutlet weak var lblTotalSum: UILabel!
    //Labels that appear when no value is given for their respective text field
    
    //Functions
    
    
    
    
    
    //Actions
    @IBAction func btnBack(_ sender: Any) {
        let destinationVC = self.storyboard?.instantiateViewController(identifier: "tabController") as! UITabBarController
        destinationVC.selectedindex = 3
        destinationVC.modalPresentationStyle = .fullScreen
        self.present(destinationVC,animated: true,completion: nil)
    }
    
    
    
    var success: Int = 0
    
    
    
    
    
    @IBAction func btncalculate(_ sender: Any) {
        success = 0
        let shower: Int? = Int(txtShowers.text!)
        if shower != nil {
            success = success + 1
            
        } else if shower == nil {
            lblShowerError.text = ("Please input a valid number")
        }
        
        let bath: Int? = Int(txtShowers.text!)
        if bath != nil {
            success = success + 1
        } else if bath == nil {
            
            lblBathError.text = ("Please input a valid number")
        }
        
        let dishwasher: Int? = Int(txtShowers.text!)
        if dishwasher != nil {
            
            success = success + 1
        } else if dishwasher == nil {
            lbldishwasherError.text = ("Please input a valid number")
            
        }
        
        let washingMachine: Int? = Int(txtShowers.text!)
        if washingMachine != nil {
            success = success + 1
            
            
        } else if washingMachine == nil {
            lblWashingMachineError.text = ("Please input a valid number")
        }
        
        let teethLength: Int? = Int(txtShowers.text!)
        if teethLength != nil {
            
            success = success + 1
        } else if teethLength == nil {
            lblTeethError.text = ("Please input a valid number")
            
        }
        
        let toiletFlushes: Int? = Int(txtShowers.text!)
        if toiletFlushes != nil {
            
            success = success + 1
        } else if toiletFlushes == nil {
            
            lblToiletError.text = ("Please input a valid number")
        }
        
        let numOfPeople: Int? = Int(txtShowers.text!)
        if numOfPeople != nil {
            
            success = success + 1
        } else if numOfPeople == nil {
            lblNumOfPeopleError.text = ("Please input a valid number")
        }
        
        
        if success == 7 {
            var totalSum = (shower! * 10)
            totalSum = totalSum + (bath! * 150)
            totalSum = totalSum + (dishwasher! * 30)
            totalSum = totalSum + (washingMachine! * 90)
            totalSum = totalSum + (teethLength! * 5)
            totalSum = totalSum + (numOfPeople! * 10)
            totalSum = totalSum + (toiletFlushes! * Int(4.5))
            lblTotalSum.text = ("Your average daily water use is \(totalSum)")
            
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        //Looks for single or multiple taps.
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self,action: #selector(self.dismissKeyboard))
        
        //Uncomment the line below if you want the tap not not interfere and cancel other interactions.
        //tap.cancelstouchesInView = false
        
        view.addGestureRecognizer(tap)
    }
    
    //Calls this function when the tap is recognized.
    @objc func dismissKeyboard() {
        //Causes the view (or one of its embedded text fields) to resign the first responder status.
        view.endEditing(true)
        
        
        
        // Do any additional setup after loading the view.
    }
    
    
    /*
     // MARK: - Navigation
     
     // In a storyboard-based application,you will often want to do a little preparation before navigation
     override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
     // Get the new view controller using segue.destination.
     // Pass the selected object to the new view controller.
     }
     */
    
}

解决方法

问题可能是您正在尝试将nil值转换为Int。

在每种此类行中:-let shower: Int? = Int(txtShowers.text!)此处txtShowers.text可以为nil或任何其他类似的值,请尝试在此设置断点。

您可以尝试使用此方法,首先使用如下所示的guard let获得所有想要的值:-

guard let shower = txtShowers.text else {\\Show some error or what you want}

这还将减少您的代码数量或代码行。

然后您可以轻松地在shower上执行操作。

仅提供信息:-您永远不要在代码中使用forcecast总是尝试使用guard letif let

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?