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