8/23.
결국 currentTitle 함수로 불러오는 것을 포기하고 미리 연산자마다 tag값을 설정해 연산자의 정보를 불러올 수 있도록 변경하였다.
@IBAction func getOperator(_ sender: UIButton) {
if currentOperator == ""{
if firstOperand == 0{
firstOperand = currentNum
}else {
doCalculate()
}
currentNum = 0
let tmp = sender.tag
switch tmp{
case 1:
currentOperator = "÷"
case 2:
currentOperator = "X"
case 3:
currentOperator = "-"
case 4:
currentOperator = "+"
default:
break
}
}else{
}
}
먼저 피연산자가 하나 밖에 없을 때, 예를 들어 숫자 4가 입력된 상황에서 연산자 +가 입력되었을때, 4를 firstOperand에 저장하고 새로운 숫자를 입력받을 수 있도록 했다.
else의 상황은 사용자가 = 버튼을 누르지 않고 계속 연산자를 입력하는 상황을 대비하여 계산을 알아서 할 수 있도록 하였다.
미리 정해둔 sender의 태그 숫자를 이용해 해당 연산자가 무엇인지 파악하여 currentOperator에 대입하였다.
사용자가 같은 연산자를 계속 누르는 것을 대비해 if-else문을 통해 오류를 방지하였다.
다음은 doCalculate 함수이다.
func doCalculate(){
switch currentOperator{
case "+":
result = firstOperand + currentNum
case "-":
result = firstOperand - currentNum
case "X":
result = firstOperand * currentNum
case "÷":
if currentNum != 0 {
result = firstOperand / currentNum
} else {
lblResult.text = "Error"
return
}
default:
break
}
currentNum = result
updateDisplay()
firstOperand = result
currentOperator = ""
}
switch문을 이용해 두 개의 피연산자의 계산을 진행하였다. 이때 나누기에서 소숫점이 발생할 수 있기 때문에 어제 만들었던 변수들의 자료형을 Double형으로 바꿔주었다. 계산을 진행하고 firstOperand에 계산 결과를 저장하고 currentOperator를 비워주면 계산 후 처리가 완료된다.
@IBAction func showResult(_ sender: UIButton) {
doCalculate() //계산 결과를 보여줌
}
위 함수를 이용하면 =버튼을 눌렀을 때의 액션함수를 쉽게 완성할 수 있다.
다음은 Label에 나타나는 값에 관한 함수인데,
func updateDisplay() {
if currentNum.truncatingRemainder(dividingBy: 1) == 0{
let formattedValue = String(format: "%.0f", currentNum)
lblResult.text = formattedValue
}else{
lblResult.text = "\(currentNum)"
}
}
자료형을 Double로 바꾸면서 숫자를 입력하면 7.0과 같이 나타나게 되었고, 소숫점이 없는 정수의 경우에는 소숫점을 없애 보기 좋게 나타낼 수 있도록하였다.
%버튼과 +/-버튼은 비교적으로 쉽게 구현할 수 있었다.
@IBAction func changeSign(_ sender: UIButton) {
currentNum *= -1
updateDisplay()
}
@IBAction func btnPercent(_ sender: UIButton) {
currentNum /= 100
updateDisplay()
}
+/- 버튼은 값의 양/음만 바꿔주면 끝이고, % 버튼은 값을 100만큼 나누어주면 끝이다.
마지막으로 문제의 .버튼인데,
.버튼은 아직까지 고민이 필요한 부분이다.