0

二次方程式を解くアプリを作成しましたが (できるかどうかを確認するためだけに)、ユーザーが誤ってスロットの 1 つに値を入力しなかった場合にアプリをクラッシュさせたくありません。助けてください。

 @IBAction func solveButton(sender: AnyObject) {

        let a:Double! = Double(textFieldA.text!)      // textfieldA is UITextField
        let b:Double! = Double(textFieldB.text!)    // textfieldB is UITextField
        let c:Double! = Double(textFieldC.text!)   // textFieldC is UITextField

        // This is for if the a value is nil
        if a == nil && b == nil && c == nil{

            errorTextField.text = "Please do not leave an empty value, all quadratic equations must have 3 values!"
            answerLabel.text = " "

            answerLabelNegative.text = " "
            whatEquation.text = " "
            return

        } else {

            let a:Double! = Double(textFieldA.text!)      // textfieldA is UITextField
            let b:Double! = Double(textFieldB.text!)    // textfieldB is UITextField
            let c:Double! = Double(textFieldC.text!)   // textFieldC is UITextField
            let x:Double = (b * b)
            let y:Double = -4 * a * c //Here I get EXC_BAD_INSTRUCTION error
            let xy:Double = x + y
            let az:Double = sqrt(xy)
            let finalTopPlus:Double = -b + az
            let finalTopMinus:Double = -b - az
            let aTwo:Double = 2 * a
            let finalEquationPositive:Double = finalTopPlus / aTwo
            let finalEquationNegative:Double = finalTopMinus / aTwo

            answerLabel.text = "Positive x = \(finalEquationPositive)"
            answerLabelNegative.text = "Negative x = \(finalEquationNegative)"

            let aValue = a < 0 ? "-" : " "
            let bValue = b < 0 ? " " : "+"
            let cValue = c < 0 ? " " : "+"
            whatEquation.text = "Equation: \(aValue) \(a)x² \(bValue) \(b)x \(cValue) \(c)"
        }
4

2 に答える 2

0

Swift では、値を強制的にアンラップする (!) か、値を条件付きでアンラップする (?) かを慎重に検討する必要があります。強制的にアンラップするnilと実行時に例外が発生するためです。

たとえば、最初の行の 1 つを取ります。これはおそらく次のようになります。

let a = Double(textFieldA.text!)

これはaa にDouble?なります。つまり、これはオプションなので、nil になる可能性があります。これはストーリーボード (またはテキスト フィールドを作成する方法) によって設定されるため、値を強制的にアンラップしても問題textFieldA.textありません。ここでの nil 値は、調査して解決する必要がある重大なエラーを表します。

オプションを指定したら、Swiftguardステートメントを使用して nil をチェックできます。guardステートメントを使用した後は、安全に ! を使用できます。値が nil ではないことがわかっているため、値を強制的にアンラップします。

@IBAction func solveButton(sender: AnyObject) {

    guard let a = Double(textFieldA.text!), 
          let b = Double(textFieldB.text!),
          let c = Double(textFieldC.text!) else {
        errorTextField.text = "Please do not leave an empty value, all quadratic equations must have 3 values!"
        answerLabel.text = " "
        answerLabelNegative.text = " "
        whatEquation.text = " "
        return
    }

    let x = (b * b)
    let y = -4 * a * c 
    let xy = x + y
    let az = sqrt(xy)
    let finalTopPlus= -b + az
    let finalTopMinus = -b - az
    let aTwo= 2 * a
    let finalEquationPositive = finalTopPlus / aTwo
    let finalEquationNegative = finalTopMinus / aTwo
    answerLabel.text = "Positive x = \(finalEquationPositive)"
    answerLabelNegative.text = "Negative x = \(finalEquationNegative)"

    let aValue = a < 0 ? "-" : " "
    let bValue = b < 0 ? " " : "+"
    let cValue = c < 0 ? " " : "+"
    whatEquation.text = "Equation: \(aValue) \(a)x² \(bValue) \(b)x \(cValue) \(c)"
}

Swift では、変数または定数の型を推論できない場合にのみ定義する必要があることに注意してください。 Double()オプションの Double を返し、2 つの Double を追加した結果は Double になるため、定数が Double になることを述べる必要はありません。

于 2016-07-02T00:34:03.327 に答える