Ios 致命错误:在展开可选值(验证空文本字段时)时意外发现nil

Ios 致命错误:在展开可选值(验证空文本字段时)时意外发现nil,ios,swift,Ios,Swift,我正在尝试验证空文本字段,即如果文本字段为空,则显示警报消息,但收到错误: 致命错误:在展开可选值时意外发现nil 这是我的代码: dateComponents.month = String(monthTextField.text!).toInt()! dateComponents.day = String(dayTextField.text!).toInt()! dateComponents.year = String(yearTextField.text!).toInt()

我正在尝试验证空文本字段,即如果文本字段为空,则显示警报消息,但收到错误

致命错误:在展开可选值时意外发现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)
    }

空字符串不能转换为整数。因此,即使在进行if展开之前,代码也会失败。我建议您将代码更改为展开整数而不是字符串,它应该可以工作。

如果
monthTextField
text
属性是空字符串(
“”
),那么问题中的代码第一行将抛出您看到的致命错误。这是因为
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
属性不是
nil
,并且在它的
text
属性上调用
toInt()
不会返回
nil
,然后将
设置为
toInt()的结果。”.

monthTextField应该如何初始化?消息说它没有被删除。您必须检查self.monthTextField.text和其他文本是否为零。nil和“”不一样。在显式展开它们之前,需要执行此操作。另外,您是否绝对确定它们可以转换为Int?如果您指出是哪条语句导致了错误,这也很有帮助。text属性定义在
text