2017-09-28 5 views
0

私はUITextFieldsから得たユーザ入力番号でいくつかの計算をしようとしています。問題は、TextFieldに何もない場合、値がゼロに設定されている必要があります。私はガードステートメントを試しましたが、間違った方法で使用しています:任意の値をアンラッピングしないようにすることを避けようとしています。

guard let number = numberTextField.text else{ let number = 0} 

このコードには何が問題がありますか?私は何を変えるべきですか?

+0

以下の方法を試してみましょうnilの値

をチェックするために使用される「聞かせ守る」あなたは文句を言わない取得なし。 numberTextField.textは空の文字列になります " –

+0

@RajeshkumarRドキュメントを見ていて、' UITextField'の 'text'プロパティはオプションです。私は知りません*なぜ*オプションですが、ドキュメントにあります。 –

+0

@CharlesSrstkaはい。 UITextFieldのtextプロパティはオプションです。しかし、textプロパティにnilを指定しても、決してゼロにならないでしょう。したがって、テキストをアンラップするためにletまたはguardを使用する必要はありません。 –

答えて

4

falseの場合は、関数を終了する必要があるため、guardステートメントは使用できません。

let number = numberTextField.text.flatMap { Int($0) } ?? 0 

なぜflatMap:代わりに、??演算子を使用する必要がありますか? 0と同じタイプになるようにStringInt(またはこれは浮動小数点値を含む場合はDouble)に変換する必要があるためです。 flatMapはオプションでtextnilではない場合にクロージャ内の値を返しますが、それがある場合はnilを返します。いずれの場合も、オプションのIntで終了し、オペレータを介してデフォルト値0を指定することで、オプションではありません。

+1

FYI - 'guard'では、ガードが入っているブロックを終了する必要があります。もちろん、ガードが関数の先頭にある場合、関数を終了する必要があります。しかし、すべての警備員が機能の最上位にあるわけではありません。 – rmaddy

0

希望の動作を得るには、ガードの代わりにデフォルト値を使用します。

let number = Double(numberTextField.text) ?? 0 
+0

なぜこれが投票されたのか分かりません。正しい解決策のようだ。オペレータ? "numberTextField.text!= nil?numberTextField.text!:0"と同じです。 – DavidN

+0

どちらかわかりません。 – Blake

+0

この問題は、タイプが一致しないことが原因です。このコードが実行された後、 'type'はどのような型ですか?それは数字か文字列ですか? – ryantxr

-1

何も空の文字列を意味していないのではなくゼロ テキストフィールドでは何も存在しない場合

if numberTextField.text.isEmpty { 
    let number = 0 
} 
関連する問題