2016-12-27 10 views
0

私はUIAlertControllerを実行しています。このメッセージを受け取りました: "オプションのチェックで使用されるタイプuitextfieldの非オプション式"。 これは私が「もし私のフィールドをつかまえたら」という行にあります。オプションのチェックで使用されるタイプ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 
    } 
} 

さらに、ここではガードを使用すると思います。 (alertController.textFields? [0])! as UITextFieldを行う

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

それはあなたが、それはすでにUITextFieldのタイプであるとき、UITextFieldalertController.textFields[0]をキャストしようとしていることを意味するので、本当に、意味がありません。

代わりに、alertController.textFieldsの最初の要素が存在するかどうかを確認する必要があります。これは、以下のコードで行うことができます。

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

なぜチェックしますか?テキストフィールドは、数行後に明確に作成されます。 – vadian

+0

@vadian 'alertController.textFields.first'はオプションなので、私たちはそれをアンラップする必要があります。あるいは、暗黙のうちに 'alertController.textFields.first! 'をアンラップすることによって常に存在することを前提とすることができます。 –

+0

あなたは仮定をする必要はありません、あなたは間違いなく**知っています**。 – vadian

関連する問題