[Swift-UIKit]계산기 만들기-2

sai06266·2023년 8월 23일

Swift

목록 보기
2/10

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만큼 나누어주면 끝이다.

마지막으로 문제의 .버튼인데,
.버튼은 아직까지 고민이 필요한 부분이다.

0개의 댓글