質問: String(format: "%.f回", y) } ```
回答: 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`を使ってその時の処理を書けます。 ``` 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 } ``` (`x2`についてもほとんど同じコードを書くだけ。) (2) 値が`nil`だった時のデフォルト値を与える`??`演算子を使う `a ?? b`と書くと`a`の値が`nil`でない場合は、その値をそのまま、`nil`だった場合は`b`の値を返す式になります。`b`の部分を「`a`に値がない場合のデフォルト値」として使うことができます。こちらを使うと例えば、こんな書き方ができます。 ``` let x1 = Float(myTextField.text ?? "0") ?? 0.0 ``` (`?? "0"`の方が`myTextField.text`が`nil`だった時のデフォルト値、`?? 0.0`の方が`Float(...)`が`nil`だった時のデフォルト値、と言うことになります。これも`x2`についてはほとんど同じことを書くだけなのですぐにわかると思います。) どちらの方が良いかは、ご自身が将来今のアプリをどの程度まで発展させるのか、くらいまで考えてご決定ください。