Swift Calculator运算符问题

时间:2016-03-08 23:23:31

标签: ios swift

大家好,感谢您访问我的页面。我目前正在学习为我的班级创建一个计算器,但是当我输入时会发现错误,例如:

5 + 5 = 10 //这是正确的

5 + 2 * 3 + 5 = 26 //还没有问题

5 + 2 = 7 +(将使用数字添加最后一个运算符。意味着在我可以选择要添加的数字之前,屏幕将显示9。)

对于我应该如何思考以解决这个问题的任何建议将不胜感激。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    enum Operation: String {
        case Divide = "/"
        case Multiple = "*"
        case Subtract = "-"
        case Add = "+"
        case Empty = "Empty"
    }

    @IBOutlet weak var outputLbl: UILabel!

    // This is initialized once the app loads. 

    var btnSound: AVAudioPlayer!

    var runningNumber = ""
    var leftValStr = ""
    var rightValStr = ""
    var currentOperation: Operation = Operation.Empty
    var result = ""


    override func viewDidLoad() {
        super.viewDidLoad()

        let path = NSBundle.mainBundle().pathForResource("btn", ofType: "wav")
        let soundUrl = NSURL(fileURLWithPath: path!)

        do {
            try btnSound = AVAudioPlayer(contentsOfURL: soundUrl)
            btnSound.prepareToPlay()
        } catch let err as NSError {
            print(err.debugDescription)
        }
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func numberPressed(btn: UIButton) {
        playSound()

        // Each button is assigned to a tag from 0-9. 
        // When button is pressed it is stored to btn.
        runningNumber += "\(btn.tag)"
        outputLbl.text = runningNumber
    }

    @IBAction func onDividePressed(sender: AnyObject) {
        processOperation(Operation.Divide)
    }

    @IBAction func onMultiplyPressed(sender: AnyObject) {
        processOperation(Operation.Multiple)
    }

    @IBAction func onSubtractPressed(sender: AnyObject) {
        processOperation(Operation.Subtract)
    }

    @IBAction func onAddPressed(sender: AnyObject) {
        processOperation(Operation.Add)
    }

    @IBAction func onEqualPressed(sender: AnyObject) {
        processOperation(currentOperation)
    }

    @IBAction func onClearPressed(sender: AnyObject) {
        clearCalcuator()
    }



    // op is what is storing the Operator. It could have been named anything
    func processOperation(op: Operation) {
        playSound()

        if currentOperation != Operation.Empty {
            // Run some math.

            // A user selected an operator, but then selected another
            // operator without first selecting a number
            if runningNumber != "" {
                rightValStr = runningNumber
                runningNumber = ""

            }

            if currentOperation == Operation.Multiple {
                result = "\(Double(leftValStr)! * Double(rightValStr)!)"
            } else if currentOperation == Operation.Divide {
                result = "\(Double(leftValStr)! / Double(rightValStr)!)"
            } else if currentOperation == Operation.Subtract {
                result = "\(Double(leftValStr)! - Double(rightValStr)!)"
            } else if currentOperation == Operation.Add {
                result = "\(Double(leftValStr)! + Double(rightValStr)!)"
            }

            leftValStr = result
            outputLbl.text = result

            currentOperation = op

        } else {
            // This is the first time an Operator has been pressed.

            leftValStr = runningNumber
            runningNumber = ""
            currentOperation = op
        }
    }

    func clearCalcuator() {
        playSound()

        if outputLbl.text != "0" {
            runningNumber = ""
            leftValStr = ""
            rightValStr = ""
            currentOperation = Operation.Empty

        }

        outputLbl.text = "0"
    }


    // Function was created to keep the code DRY. 
    // Now can use playSound() on top. Exp: Line 51
    func playSound() {
        if btnSound.playing {
            btnSound.stop()
        }

        btnSound.play()
    }
}

我仍然是SWIFT的初学者,但希望通过向更好理解的人学习来提高。如果您对我目前的代码有任何关于如何改进的建议,欢迎所有建议。再次感谢你。

2 个答案:

答案 0 :(得分:1)

您描述的行为是@IBAction =传递Operation currentOperation这一事实的结果,这意味着如果最后一次操作是{ {1}},这意味着+按钮的行为就像再次点击=一样。这就是你看到自己行为的原因。

要解决此问题,您需要确保在按+时,=会将processOperation设置为其他内容,以便在您下次呼叫currentOperation时,进行进一步的计算。为此,您需要做的就是为processOperation再添加一个caseOperation

=

然后更改enum Operation: String { case Divide = "/" case Multiple = "*" case Subtract = "-" case Add = "+" case Equal = "=" case Empty = "Empty" } 的{​​{1}}只是传递此@IBAction而不是=

Operation

因此,当您致电currentOperation时,会执行@IBAction func onEqualPressed(sender: AnyObject) { processOperation(.Equal) } ,然后一旦完成,它会将processOperation重置为currentOperation,下次您对currentOperation进行下一次调用时,它不会重复基于Operation.Equal的任何进一步计算。

答案 1 :(得分:0)

您应该将其保存到一个变量,除非已清除,否则您的下一个操作就会发生。

var answer = 5 + 2

在计算器中显示您的answer变量,然后如果按下另一个操作按钮,则使用答案变量e.x. + 9 如果用户点击answer + 9您刚刚设置=

,则16会更新ui以显示clear