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로 바꾸기만 하면된다.
다음에는 연산자 버튼을 해결할 방법과 나머지를 완성할 예정이다.