2016-12-28 4 views
0

文字列の入力エラーを検出してユーザーに通知する方法が必要です。 次の例を見てください:Swiftのコンパイラエラーを回避するためにOptionalsを使用する方法

let fraction   = "15/8" 

    let fractionArray  = fraction.components(separatedBy: "/") 
    let numerator   = Double(fractionArray[0]) 
    let denominator   = Double(fractionArray[1]) 
    var linearFactor  = numerator!/denominator! 

    print(numerator!, "/", denominator!, " = ", linearFactor) 

しかし、私はアンラップを強制する場合は、文字列内の無効な文字は、コンパイルエラーを強制し、私はむしろ、入力文字列が無効な分数が含まれていることをユーザに通知したいです。オプションの連鎖はやり方のように思えますが、私は構文の権利を得ることができません。

私のコード()の下に、fraction?.components(separatedBy: “/“)を含む配列の隣にオプションの連鎖演算子を配置しますが、Fix-itはそれを削除するように指示します。

この問題に対処するためのオプションのチェーンよりも良い方法がある場合は、誰かが私が答えを検索したときに逃したかもしれないものを説明してください。hereコードを動作させることができますか?おかげ

let fraction   = “15/8” 

    if let fractionArray = fraction?.components(separatedBy: “/“) { 
    let numerator   = Double(fractionArray[0]) 
    let denominator   = Double(fractionArray[1]) 
    var linearFactor  = numerator/denominator 

    print(numerator, "/", denominator, " = ", linearFactor) 
     } else { 
      print(“Invalid. Re-enter fraction”) 
     } 
+0

'分数?コンポーネント(separatedBy:"/")は最も明白な場所のようです - 何?それははっきりとは逆です。 'fraction'は間違いなくOptionalですが、' components(separatedBy:) 'の結果はです。そして '?'はここでは宣言されていませんが、オプションの連鎖演算子です。 – user28434

+2

実際にあなたの前の質問への両方の答えhttp://stackoverflow.com/questions/41336818/can-i-split-a-numeric-string-using-multiple-separators-in-a-swift-closure使用方法の表示*強制的なアンラップの代わりにオプションのバインディング*。 –

+2

参照[オプションの値とnilを比較する必要はいつですか](http://stackoverflow.com/questions/29717210/when-should-i-compare-an-optional-value-to-nil)強制アンラッピングを避ける方法の良い例。 - Btw、アンラッピングnilは*ランタイムエラーです。*コンパイルエラーではありません。 –

答えて

3
  1. 割合は文字列ないStringですか?ですので、分数を使用する必要はありませんか?
  2. コンポーネント返品[]なし[]?、あなたはアンラップしなければならない唯一のことは、分子分母あるアンラップ何
  3. なしfractionArrayを使用することができますので、その種類はダブルですか?
  4. おかげ@OOPer、分母をチェックする必要があります= R @Martin 0
  5. おかげで、私は次のコードをリファクタリングしますfractionArray.count == 2

をチェックする必要があります:!

let fraction = "15/8" 
let fractionArray = fraction.components(separatedBy: "/") 
guard let numerator = Double(fractionArray[0]), 
    let denominator = Double(fractionArray[1]), 
    denominator != 0, 
    fractionArray.count == 2 else { 
    print("Invalid. Re-enter fraction, or denominator == 0, or fractionArray.count != 2") 
    return 
} 
let linearFactor = numerator/denominator 
print(numerator, "/", denominator, " = ", linearFactor) 
+2

これは主要な話題ではないかもしれませんが、コードをクラッシュセーフにしたい場合は、 'denominator'がゼロでないことを確認する方がよいでしょう。 – OOPer

+1

thx、あなたは正しいですが、1.0/0.0 = inf、0.0/0.0 = nanは上記のコードの結果になります –

+2

右。私の間違いは、「inf」と「nan」は避けるべきことかもしれませんが、「Double」でゼロ除算がクラッシュすることはありません。ごめんなさい。 – OOPer

関連する問題