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

sai06266·2023년 8월 23일

Swift

목록 보기
1/10

8/22.
UIKIT을 이용하여 기본적인 앱인 계산기를 만들어보려고 한다.

스토리보드를 이용하여 기본적인 UI를 완성하였다.
값을 나타낼 Label, 사용자에게 입력받을 Button들을 추가하였다.

먼저 필요한 변수들을 정의했는데

    @IBOutlet var ACbutton: UIButton!
    @IBOutlet var lblResult: UILabel!
    var currentNum = 0
    var currentOperator = ""
    var firstOperand = 0

숫자가 입력되었을 때 AC버튼을 C버튼으로 바꾸기 위해 AC버튼을 정의했고,
계산한 값을 보여주기 위해 Label을 정의했다.
currentNum은 현재 입력받고 있는 수를 저장하는 변수,
currentOperator는 연산자를 입력받았을 때 저장해주는 변수,
firstOperand는 연산자가 입력되었을 때 currentNum을 초기화하기 전에 저장해줄 변수로 정의하였다.

다음으로는 각각의 숫자 버튼을 액션함수에 연결하여 클릭했을 때 등록해둔 버튼의 태그를 통해 입력된 숫자를 인식하고 라벨의 숫자가 변경될 수 있도록 하였다

	@IBAction func getNum(_ sender: UIButton) {
        let digit = sender.tag
        currentNum = currentNum * 10 + digit
        lblResult.text = String(currentNum)
        if currentNum != 0{
            ACbutton.setTitle("C", for: .normal)
        }
    }

이제 연산자를 입력받았을 때 연산자의 정보를 얻어오는 과정인데,
button의 title을 받아오는 currentTitle함수나 currentAttributedTitle함수를 사용해도 버튼의 title이 불러와지지 않는 상황이 발생하였다.
무엇이 문제인지 궁금하여 디버깅 코드를 작성해보았다.

    @IBAction func getOperator(_ sender: UIButton) {
        if currentNum != 0 {
            firstOperand = currentNum
            currentNum = 0
        }
        if let attributedTitle = sender.currentAttributedTitle?.string {
            print("Attributed Title: \(attributedTitle)")
            currentOperator = attributedTitle
        } else if let normalTitle = sender.currentTitle {
            print("Normal Title: \(normalTitle)")
            currentOperator = normalTitle
        } else {
            print("No Title found.")
        }
        
        print("currentOperator: \(currentOperator)")
    }

확실하게 연산자와 액션함수는 연결이 되어있는 상태였고, 각각의 버튼의 title도 지정되어있는 상태였기 때문에 무엇이 문제인지 알 수 없었다.

연산자를 클릭하면 위와 같은 문장이 나왔다.
즉, 두 가지의 함수를 모두 사용하더라도 버튼의 title을 불러오지 못한다는 의미였다.

연산자 버튼을 내버려두고 AC/C버튼의 기능을 활성화했다.

    @IBAction func clearButtonTapped(_ sender: UIButton) {
        currentNum = 0
        firstOperand = 0
        currentOperator = ""
        lblResult.text = "0"
        ACbutton.setTitle("AC", for: .normal)
    }

모든 변수들을 초기화하고 C버튼의 title을 AC로 바꾸기만 하면된다.

다음에는 연산자 버튼을 해결할 방법과 나머지를 완성할 예정이다.

0개의 댓글