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