24048


テキストフィールドが空の時にボタンイベントを発動するとエラーが出てしまいます。

テキストフィールドに何も打ち込まれてない時、小数点以外の文字を打ち込んだ時の処理を教えてください。

追記

テキストフィールドが何も打ち込まれていないとき、違う文字が打ち込まれたときはx１及びx２に０を代入したいです。

[code]

    internal func onClickMyButton(sender: UIButton){
    
    
            let x1 = Float(myTextField.text!)
            let x2 = Float(myTextField2.text!)
    
            y = x1! * x2!
    
            score.text = String(format: "%.f回", y)
        }
    
[/code]


CC BY-SA 3.0
2016-04-15T06:03:20.983
24038
2016-04-15T10:49:55.370
2016-04-15T10:04:18.230
11019
11019
question
ios swift iphone swift2
テキストフィールドが空の時のボタンイベントでエラーが出てしまう。


Swiftの`!`をforced
unwrappingとして使うのは、Swiftに対して「もし値が`nil`ならアプリをクラッシュさせてください」と言っていることになります。Swiftのコードサジェスチョンでは、Optionalではいけない場所にOptionalになる可能性のある式を使うと、`!`を付け加えるのを第一候補に提示してきますが、あまり鵜呑みにせずに、本当に「`nil`ならクラッシュ」があなたの望む動作なのか確認してください。

さて、あなたのコードには4箇所`!`があります。`UITextField`の`text`プロパティはOptionalつまり`nil`になる可能性があります。また`Float.init(_:)`で`String`を`Float`に変換する場合も`nil`になる可能性(数として解釈できない場合)があります。

Optionalなデータをnon-Optionalとして使う方法は、危険な`!`を使う以外にも大きく2種類あります。

(1) Optional bindingと呼ばれるif-letを使う方法

値が`nil`でないことを確かめてから変数(`let`だから定数といった方が良いかもですが)に値を代入してくれます。もし`nil`だったら、普通のif文と同じように`else`を使ってその時の処理を書けます。

[code]

        let x1: Float
        if let
            text = myTextField.text, //`text`には、`myTextField.text`が`nil`でない時だけ値が入る
            value = Float(text) //`value`には、`Float(text)`が`nil`でない時だけ値が入る
        {
            x1 = value //`value`は`Float(text)`が`nil`でなかった時の値が入っている
        } else {
            //この部分は、`myTextField.text`か`Float(text)`のどちらかが`nil`だった時に実行される
            x1 = 0
        }
    
[/code]

(`x2`についてもほとんど同じコードを書くだけ。)

(2) 値が`nil`だった時のデフォルト値を与える`??`演算子を使う

`a ??
b`と書くと`a`の値が`nil`でない場合は、その値をそのまま、`nil`だった場合は`b`の値を返す式になります。`b`の部分を「`a`に値がない場合のデフォルト値」として使うことができます。こちらを使うと例えば、こんな書き方ができます。

[code]

        let x1 = Float(myTextField.text ?? "0") ?? 0.0
    
[/code]

(`?? "0"`の方が`myTextField.text`が`nil`だった時のデフォルト値、`??
0.0`の方が`Float(...)`が`nil`だった時のデフォルト値、と言うことになります。これも`x2`についてはほとんど同じことを書くだけなのですぐにわかると思います。)

どちらの方が良いかは、ご自身が将来今のアプリをどの程度まで発展させるのか、くらいまで考えてご決定ください。


CC BY-SA 3.0
2016-04-15T10:49:55.370
24048
2016-04-15T10:49:55.370
13972
24038
answer