Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Calculator可以完美地工作,但在执行新操作时却不能_Swift - Fatal编程技术网

Swift Calculator可以完美地工作,但在执行新操作时却不能

Swift Calculator可以完美地工作,但在执行新操作时却不能,swift,Swift,今天我花了一天时间熟悉swift,我决定试着做一个计算器。除了一个问题,我的整个工作都在进行中: 1+1将返回2到标签(这很好) 但是当我尝试键入一个新的数字时,例如1,字符串被追加到21,而不是清除标签并放置一个单数1 之所以出现这种情况,是因为我想为操作员添加一个选项,使其能够继续添加ex: 1+1返回2,然后用户键入+3以获得5的结果 唯一的问题是我不知道只有在按下等号后输入新号码时如何清除标签 下面是视图控制器的代码,希望我不必想到完全不同的方法 import UIKit class

今天我花了一天时间熟悉swift,我决定试着做一个计算器。除了一个问题,我的整个工作都在进行中:

1+1将返回2到标签(这很好)

但是当我尝试键入一个新的数字时,例如1,字符串被追加到21,而不是清除标签并放置一个单数1

之所以出现这种情况,是因为我想为操作员添加一个选项,使其能够继续添加ex:

1+1返回2,然后用户键入+3以获得5的结果

唯一的问题是我不知道只有在按下等号后输入新号码时如何清除标签

下面是视图控制器的代码,希望我不必想到完全不同的方法

import UIKit

class ViewController: UIViewController {
    var num1 = ""
    var num2 = ""
    var finalString = ""
    var isFirstNumber = true
    var hasFinalString = false
    var isClear = true

    override func viewDidLoad() {
        super.viewDidLoad()
          // Do any additional setup after loading the view, typically from a nib.
    }

    @IBOutlet weak var LBLOutput: UILabel!
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }





    @IBAction func btrNumberClick(_ sender: UIButton) {
        if isClear {
            LBLOutput.text = ""
            isClear = false
        }
        let currentText = LBLOutput.text!
        let textLabel = sender.titleLabel?.text
        if let text = textLabel {
            switch text {
            case "+", "x", "/", "-","%":
                if hasFinalString {
                    return
                }
                finalString = text
                isFirstNumber = false
                hasFinalString = true
                LBLOutput.text = "\(currentText) \(finalString) "
                break
            case "=":
                isFirstNumber = true
                hasFinalString = false
                isClear = true
                let result = calculate()
                LBLOutput.text = "\(result)"
                num1 = "\(result)"
                break
            default:
                if isFirstNumber {
                    num1 = "\(num1)\(text)"
                } else {
                    num2 = "\(num2)\(text)"
                }
                LBLOutput.text = "\(currentText)\(text)"
                break;
            }
        }
    }
    func calculate() -> Double {
        let firstNumber = Double(num1)!
        let secondNumber = Double(num2)!
        num1 = ""
        num2 = ""
        isClear = false
        switch finalString {
        case "+":
            return firstNumber + secondNumber
        case "-":
            return firstNumber - secondNumber
        case "x":
            return firstNumber * secondNumber
        case "/":
            return firstNumber / secondNumber
        case "%":
            return (firstNumber * 100) / secondNumber
        default:
            return 0
        }
    }

    @IBAction func clearTheLabel(_ sender: Any) {
        num1 = ""
        num2 = ""
        LBLOutput.text = "0"
        isClear = true
    }




}
为什么这样不行

default:
   if isFirstNumber {
       LBLOutput.text = ""
       num1 = "\(num1)\(text)"
       LBLOutput.text = num1
   } else {
       num2 = "\(num2)\(text)"
       LBLOutput.text = "\(currentText)\(text)"
   }
   break;
}
如果仅在按下=后isFirstNumber才为真,则清除似乎是正确的。我希望我能理解你的问题。
顺便说一句:斯坦福课程中的计算器示例将所有按钮连接到一个iAction,正如您所做的那样。我认为switch语句非常清晰,并且是针对这样的示例而做的。

备注:我建议为每个按钮创建一个iAction,而不是将所有按钮连接到同一个iAction,并通过其文本识别它,这样会更具可读性,甚至更有效。我回家后会尝试一下。很遗憾,这并没有清除标签。我想这也行。我已经稍微修改了我的答案。我认为您需要在
if else
的每个部分中使用
LBLOutput.text=“\(currentText)\(text)”
,并相应地更改其值。这到底是什么意思?对不起,我不明白。我尝试了上面的代码,数字仍然显示在计算的数字之后。示例:1+3=4,然后我尝试键入6,并在输出中得到46