2016-12-27 2 views
0

Я делаю UIAlertController, и я получил это сообщение: «Необязательное выражение типа uitextfield, используемое при проверке на наличие опций». Это в строке, где у меня есть «if let my field».Необязательное выражение типа 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])! 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

Вы не должны проверять, существует ли текстовое поле, поскольку оно не является необязательным. Вы можете использовать это: 'let field = alertController.textFields.first!' И чем вы можете выполнять свои действия. –

ответ

4

Вы принудительно разворачиваете значение, поэтому оно не является необязательным. Это то, что сообщение сообщает вам.

Поскольку вы определенно добавили текстовое поле оповещения контроллера не нужны никакие проверки и код может быть сокращен:

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

Нет Тип аннотаций, нет тип литья, компилятор может сделать ряд выводов тип.

Чтобы проверить пустую строку есть и более удобный синтаксис:

if !field.text.isEmpty { ... 
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 
} 
0

Ведение (alertController.textFields? [0])! as UITextField, на самом деле не имеет смысла, потому что это означает, что вы пытаетесь бросить alertController.textFields[0] к UITextField, когда это уже тип UITextField.

Что вам нужно сделать, это проверить, существует ли первый элемент alertController.textFields, который вы можете сделать с помощью кода ниже.

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

Зачем нужна проверка? Текстовое поле, очевидно, создано несколькими строками позже. – vadian

+0

@vadian, потому что 'alertController.textFields.first' является необязательным, и нам нужно развернуть его. Или вы можете сделать предположение, что он всегда будет существовать, неявно отказываясь от него 'alertController.textFields.first!' –

+0

Вам не нужно делать предположения, вы определенно ** знаете ** это. – vadian

Смежные вопросы