Written by
Amy
on
on
Swift 계산기 만들기 v0.3
Swift로 계산기 만들기 - Refactoring 3차 (작업 시간: 약 30분)
- 연산 기호 중복 클릭 기능 추가 및 변수 이름 직관적으로 수정
- 중복되는 조건 구문 통합
class ViewController: UIViewController {
@IBOutlet var displayLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
displayLabel.text = "0"
}
// 변수 정의
// 01. 라벨에 출력될 값을 결정할 displayText, 최초 nil
var displayText: String? = nil
// 02. 연산 기호를 저장해둘 operatorSign, 최초 nil
var operatorSign: String? = nil
// 03. 연산을 기다리는 값과 현재 인풋된 값을 구분하는 변수
var firstNum: Int = 0
var secondNum: Int = 0
// 함수 정의
// 01. 전시(displayLabel.text)될 숫자 만드는 함수
@IBAction func btnNumberClick(numBtn: UIButton) {
// 최초 실행의 경우는 입력된 숫자 스트링을 displayText에 대입
if displayText == nil {
displayText = (numBtn.titleLabel?.text)!
// 최초 실행이 아닌 경우는 입력된 숫자 스트링을 displayText에 더하기 연산
}else {
displayText? += (numBtn.titleLabel?.text)!
}
// 라벨에는 displayText 전시
displayLabel.text = displayText
}
// 02. 리셋(AC)버튼 클릭 시 모든것을 기본값으로 리셋해주는 함수
@IBAction func btnResetClick(resetBtn: UIButton) {
displayLabel.text = "0"
displayText = nil
firstNum = 0
secondNum = 0
operatorSign = nil
}
// 03. 연산 기호 눌렸을 때의 기능 정의
/*
3-1. displayText != nil일 때만 operation 함수 실행
3-2. 눌려진 연산기호가 = 일 경우엔 최종 값을 출력.
3-3. 일단 기존 기호를 가지고 연산한 뒤에 입력된 연산 기호로 change
3-4. 연산 완료 후에는 displayText 초기화
3-5. = 을 누르고 해당 값에 또 연산할 수 있음
*/
@IBAction func operation(signBtn: UIButton) {
if displayText != nil {
Operation()
operatorSign = signBtn.titleLabel!.text!
displayText = nil
if signBtn.titleLabel!.text! == "=" {
displayLabel.text = String(firstNum)
}
}else {
operatorSign = signBtn.titleLabel!.text!
}
}
// 04. 함수 내에서 쓰일 내부 연산 함수 Operation
/*
4-1. operatorSign == nil, 최초 연산 시점, firstNum에 현재 displayText에 저장된 숫자를 대입
4-2. firstNum에 값이 있다면, 연산을 기다리는 displayText가 존재한다는 뜻으로, 연산 기호에 맞춰 연산을 해준다.
*/
private func Operation() {
if operatorSign == nil {
firstNum = Int(displayText!)!
}else {
secondNum = Int(displayText!)!
if operatorSign == "+" {
firstNum += secondNum
}else if operatorSign == "-" {
firstNum -= secondNum
}else if operatorSign == "x" {
firstNum *= secondNum
}else if operatorSign == "÷" {
firstNum /= secondNum
}
displayLabel.text = String(firstNum)
}
}
}