개발하는 뚝딱이

[iOS] 계산기 만들기 D+1 본문

iOS 개발일지

[iOS] 계산기 만들기 D+1

개발자뚝딱이 2020. 3. 5. 20:27

 

 

iOS 계산기 만들기 개발 1일차

 

 


깃 허브 저장소 주소 ⤦

https://github.com/TheSongOfSongs/Calculator

 

왜 계산기를 만드는가

iOS를 시작하면서 스위프트 언어를 시작하였다. 객체지향 언어로는 JAVA와 C++를 다룬 적이 있으며, 형태는 javascript나 python과 비슷하여 쉽게 공부하는 중이다. 스위프트를 공부하면서 함께 코딩테스트도 준비 중인데 내가 푼 문제들과 다른 이들이 푼 코드에서 줄 수가 엄청 차이가 난다. 누군가는 한 줄의 return으로 끝낸 것도 많았고, 심지어 읽지도 못하는 것들로 가득하다. 차이점이 closure라는 것을 알았고 이를 더 잘 쓰기 위해, 개발 첫 앱을 '간단한 계산기'로 결정하였다. (시작해보니 생각보다 간단하지 않았다...)

 

 

시나리오

1. 기본 계산기 기능

  • 숫자 0 ~ 9
  • . (소수 표현)
  • + - * / % +/- 연산
  • C
  • =
  • 출력 레이블

 

2. 확장 기능

  • ( ) 기능
  • 출력 레이블 위에 수식 표현

 

 

구현 내용

계산기

출력 레이블은 printNum이라는 변수가 화면에 표시된다. 형태는 Int이며, 출력될 때 String으로 타입캐스팅 되도록 하였다.

 

1. 숫자 클릭했을 때

var printNum = 0

@IBOutlet var result: UILabel!

@IBAction func num1(_ sender: Any) { resultChange(1) }

func resultChange(_ a: Int) {
    printNum = printNum * 10 + a
    result.text = String(printNum)
}

func num1은 num0부터 num9까지 같은 형태로 만들어 각 버튼과 연결하였다. 숫자 버튼을 눌렀을 때 실행하는 함수는 resultChange(_ a: Int)로 현재 값과 이에 따른 결과를 출력 레이블까지 바꾸도록 하였다.

 

 

2. 연산자를 클릭했을 때

    var operation = 0 // +1, -2, *3, /4, %5 
    
    @IBAction func plus(_ sender: Any) {
        whenSelectedOperator(1)
    }
    
    @IBAction func clear(_ sender: Any) {
        printNum = 0
        result.text = "0"
    }
    
    @IBAction func toggle(_ sender: Any) {
        printNum *= -1
        result.text = String(printNum)
    }
    
    func whenSelectedOperator(_ num:Int) {
        guard !isSelectedOperatior else {
            return
        }
        isSelectedOperatior = true
        operation = num
        tempNum = printNum
        printNum = 0
    }

사칙연산자를 눌렀을 때 func plus(_ sender: Any) 각각 같은 형태로 실행된다. 이 때 whenSelectedOperator()의 인자는 1부터 5까지 각각으로 주었다.

whenSelectedOperator(_ num: Int)에서 연산자가 눌러져있는지 먼저 확인한다. 어떠한 연산자라도 눌러져있는 상태라면 함수 밖으로 나가고, 아니라면 현재 출력되어 있던 값을 tempNum 변수에 저장 후, printNum은 0으로 초기화한다.

 

3. 연산 기능 함수

@IBAction func print(_ sender: Any) {
        switch operation {
        case 1:
            operateTwoNum(tempNum, printNum, operation: operateAdd)
        case 2:
            operateTwoNum(tempNum, printNum, operation: operateSub)
        default:
            break
        }
        operation = 0
        isSelectedOperatior = false
    }
    
    func operateTwoNum(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) {
        printNum = operation(a, b)
        result.text = String(printNum)
    }
    
    var operateAdd: (Int, Int) -> Int = { $0 + $1 }
    var operateSub: (Int, Int) -> Int = { $0 - $1 }

print(_sender: Any)는 '=' 버튼을 눌렀을 때 결과를 출력하도록 구현하였다. 연산과 출력을 하고, 더불어 아무 연산자도 선택되어 있지 않도록 변경하는 기능을 담당하는 함수이다. 사칙 연산과 나머지는 operateTwoNum 함수에 구하는 수 두 개와 클로저를 넣도록 만들었다. 클로저를 연습하기 위함이 아니라면, 굳이 operateTwoNum을 쓰는게 아니라 바로 함수 print(_ sender: Any)에서 값을 구해도 괜찮지 않을까. 함수가 길어지겠으나 여러 번 다른 함수를 호출하는 것과 비교했을 때 더 나을 것이다. 

 

 

해결해야 할 과제

소수 기능을 위해서 Double을 사용해야 하는데 현재 계산하려는 값을 저장하는 printNum과 tempNum은 모두 Int로 지정되어 있다. 단순하게 타입 캐스팅으로 해결하려고 했을 때, 인자로 다른 함수로 넘겨질 때 타입 오류가 발생하여 불가능하다. 이를 해결해야 한다.

 

 

테스트 영상

 

 

 

'iOS 개발일지' 카테고리의 다른 글

[iOS] 계산기만들기 D+5  (0) 2020.03.26
[iOS] 환율계산기1  (0) 2020.03.24
[iOS] 계산기만들기 D+4  (0) 2020.03.12
[iOS] 계산기 만들기 D+3  (0) 2020.03.10
[ios] 계산기 만들기 D+2  (0) 2020.03.06