我正在做一个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)
}
有谁能告诉我如何删除此警告? 我试图删除“!”没有成功。
答案 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 {
...
}