コメントに記載されているように、常に 'クラッシュ演算子'(!
)を使用しないでください。代わりにオプションの値を安全に処理する方法を学んでください。そして、あなたがそれらをアンラップ強制しようとしている - titleLabel
、text
またはInt(...)
いずれかがnil
あるため
あなたのプログラムがクラッシュしています。これは、あなたのボタンにtitleLabel
がないか、titleLabel
のテキストがInt
に変換できないことを意味する可能性があります。
解決策は、選択肢に遭遇したときに安全に対処することです。これを行うには多くの方法がありますが、通常は1つまたは複数のguard
ステートメントを使用します。これにより、値がある場合はオプションで安全にアンラップすることができます。そうでない場合は、大括弧内のコードが実行されます。これは、将来のコードがnil
でない場合、に依存する場合に便利です。例:
guard let buttonText = sender.titleLabel?.text else {
print("Sender didn't have either a titleLabel or text!")
return
}
guard let textAsInt = Int(buttonText) else {
print("Text wasn't convertible to an Int!")
return
}
currentNumber = currentNumber*10 + Float(textAsInt)
ここで、クラッシュではなくprint
メッセージが表示されます。したがって、何がうまくいかなかったのか、それを修正するために何ができるのか(修正が必要な場合)
また、あなたは、より簡潔なコードが必要な場合は、単一のguard
にこれらのチェックの両方を統合し、あまり正確なエラーでした:
guard let buttonText = sender.titleLabel?.text, textAsInt = Int(buttonText) else {
print("Something went wrong when converting the button title to an Int!")
return
}
currentNumber = currentNumber*10 + Float(textAsInt)
それとも、クロージャを好きなら、あなたがflatMap
を使用することができます。
guard let i = sender.titleLabel?.text.flatMap({Int($0)}) else {
print("Something went wrong when converting the button title to an Int!")
return
}
currentNumber = currentNumber*10 + Float(i)
を
flatMap
オプションは最初はちょっと奇妙に見えますが、ボタンのtitleLabel
のtext
をInt
に変換しようとしています。失敗した場合はnil
(guard
が受け取る)を返し、そうでない場合はテキストの数値を返します。 @vacawama said in the commentsとして
、あなたもtitleLabel
、text
またはInt(...)
がnil
であることをイベントで0
を使用するためにnilを合体演算子を使用することができます。
currentNumber = currentNumber * 10 + Float(Int(sender.titleLabel?.text ?? "") ?? 0)
しかし、これができたことを心に留め予想外の動作につながります。私はあなたのロジックが非数値ボタン、例えば "+"ボタンのために実行されているので、あなたのプログラムがクラッシュしていると思われます。この場合、数字以外のボタンを押すたびに、あなたの番号に10
を乗算します。最初に論理が数字ボタンでのみ呼び出されるようにする必要があります。
あなたのフルコードは表示されませんが、確かに言うのは難しいですが。安全にこのextensive Q&A on the subjectを参照してください、optionalsに対処する方法についての詳細情報については
。
これは、 "force unwrap"演算子( '!')を乱用しない理由です。あなたがそれを使うとき、あなたはコンパイラに「私が望むこの値はオプションであり、それは「無」であるかもしれないと理解していますが、そうではないと仮定しています。あなたがプログラムを実行して、実際には値が「nil」になると、プログラムは「私はあなたを信頼しました:」と嘘をついてしまい、究極的に自殺してしまいます。 – Alexander
あなたの応答に感謝します。そのエラーを避けるために私は何を変更するのですか? – jimmythecat
クラッシュを避けるためにnil coalescing演算子を使用してください: 'currentNumber = currentNumber * 10 + Float(Int(sender.titleLabel?.text ??" ")?0) ' – vacawama