用于检查选项的uitextfield类型的非可选表达式

时间:2016-12-27 12:05:50

标签: swift swift3

我正在做一个UIAlertController,我收到了这条消息: “用于检查选项的uitextfield类型的非可选表达式”。 这就是我有“if let my field”的行。

我收到了这段代码:

let alertController = UIAlertController(title: "Adding", message: "Type something", preferredStyle: UIAlertControllerStyle.alert)
let DestructiveAction = UIAlertAction(title: "Confirm", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in

if let field : UITextField = (alertController.textFields? [0])! as UITextField  {

 if field.text != "" {
//my actions                
        }

    }
    let okAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
    }
    alertController.addTextField { (textField) in
        textField.placeholder = "Type designation here"

    }
    alertController.addAction(okAction)
    alertController.addAction(DestructiveAction)
    self.present(alertController, animated: true, completion: nil)
}

有谁能告诉我如何删除此警告? 我试图删除“!”没有成功。

3 个答案:

答案 0 :(得分:4)

您被迫展开该值,因此它是非可选的。这就是消息告诉你的。

由于您确实已将文本字段添加到警报控制器,因此您无需进行任何检查,并且可以缩短代码:

let field  = alertController.textFields![0] // or textFields.first!

没有类型注释,没有类型转换,编译器可以推断出类型。

要检查空字符串,还有一种更方便的语法:

if !field.text.isEmpty { ...

答案 1 :(得分:0)

您不需要进行演员表示,alertController.textFields的类型已经[UITextField]。添加演员是真正导致问题的原因。

let alertController = UIAlertController(title: "Adding", message: "Type something", preferredStyle: UIAlertControllerStyle.alert)
let DestructiveAction = UIAlertAction(title: "Confirm", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
    if let field : UITextField = alertController.textFields?[0]  {
        if field.text != "" {
            //my actions
        }
    }
}

我想向您展示更多内容。你不需要设置类型,我尽量使我的条件尽可能具体。

let alertController = UIAlertController(title: "Adding", message: "Type something", preferredStyle: UIAlertControllerStyle.alert)
let DestructiveAction = UIAlertAction(title: "Confirm", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
    if let text = alertController.textFields?[0].text, !text.isEmpty {
        //my actions
    }
}

另外,我想我会在这里使用一名警卫。

let alertController = UIAlertController(title: "Adding", message: "Type something", preferredStyle: UIAlertControllerStyle.alert)
let DestructiveAction = UIAlertAction(title: "Confirm", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
    guard let text = alertController.textFields?[0].text, !text.isEmpty else {
        return
    }

    //my actions
}

答案 2 :(得分:0)

执行(alertController.textFields? [0])! as UITextField,实际上没有意义,因为这意味着您正在尝试将alertController.textFields[0]投射到UITextField,因为它已经是UITextField的类型}。

您应该做的是检查alertController.textFields的第一个元素是否存在,您可以使用以下代码执行此操作。

if let field : UITextField = alertController.textFields.first  {
    ...
}