我正在尝试验证空文本字段,即如果文本字段为空,则显示警告消息,但我收到错误:
致命错误:在解包可选值时意外发现nil
这是我的代码:
dateComponents.month = String(monthTextField.text!).toInt()!
dateComponents.day = String(dayTextField.text!).toInt()!
dateComponents.year = String(yearTextField.text!).toInt()!
if self.monthTextField.text == ""{
let alertController = UIAlertController(title: "Month", message:
"Please enter 2 digits in the 'mm' field, e.g. 01 for January", preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))
self.presentViewController(alertController, animated: true, completion: nil)
}
答案 0 :(得分:1)
如果monthTextField
的{{1}}属性为空字符串(text
),则问题代码中的第一行会抛出致命错误&#39重看这是因为""
将返回toInt()
并且您正试图强制用nil
解包(这将导致崩溃)。
使用强制解包就像你正在做的那样会成为一个问题。如果您的文本字段为!
或其nil
属性中包含非数字字符串,则表示该致命错误。我会通过使用可选绑定和可选链接的组合来验证文本字段中的文本(以及文本字段本身,如果需要)。这看起来像这样:
text
该代码不会崩溃,因为它确保它的每一步都不会展开var monthTextFields: UITextField? // Set via code or xib or storyboard, doesn't matter
if let month = monthTextField?.text?.toInt() {
/* month is now an Int that you can safely use */
} else {
/* the text is not a valid Int, display your alert */
}
值。 nil
行基本上说的是:"如果if
不是monthTextField
且其nil
属性不是text
并且调用{{1}在其nil
属性上不会返回toInt()
,然后将text
设置为nil
"的结果。
答案 1 :(得分:0)
空字符串无法转换为int。因此,即使在您展开之前,您的代码也会失败。我建议你改变你的代码来打开整数而不是字符串,它应该可以工作。