大家好,感谢您访问我的页面。我目前正在学习为我的班级创建一个计算器,但是当我输入时会发现错误,例如:
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的初学者,但希望通过向更好理解的人学习来提高。如果您对我目前的代码有任何关于如何改进的建议,欢迎所有建议。再次感谢你。
答案 0 :(得分:1)
您描述的行为是@IBAction
=
传递Operation
currentOperation
这一事实的结果,这意味着如果最后一次操作是{ {1}},这意味着+
按钮的行为就像再次点击=
一样。这就是你看到自己行为的原因。
要解决此问题,您需要确保在按+
时,=
会将processOperation
设置为其他内容,以便在您下次呼叫currentOperation
时,进行进一步的计算。为此,您需要做的就是为processOperation
再添加一个case
到Operation
:
=
然后更改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