개발하는 뚝딱이

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

iOS 개발일지

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

개발자뚝딱이 2020. 3. 12. 02:09

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

 

 


깃 허브 저장소 주소 ⤦

https://github.com/TheSongOfSongs/Calculator

 

 

구현목표

연산 결과, 일정 수준이 되면 자연로그 e가 발생한다. 이를 사용자가 알기 쉬운 표현으로 바꿔주자.

괄호 앞, 뒤에 연산자 없이 숫자만 입력되어 있으면 자동으로 * 를 적어준다.

 

 

구현 내용

func removeE(num: String) -> String {
        let a = num
        
        if a.contains("e-") {
            var temp = ""
            
            for i in 0..<a.count {
                let index = a.index(a.startIndex, offsetBy: i)
                if a[index] == "e" { break }
                if a[index] == "." { continue }
                temp.append(a[index])
            }
            
            let start = a.index(a.startIndex, offsetBy: a.count-2)
            let end = a.index(a.startIndex, offsetBy: a.count)
            let sub = a[start..<end]
            
            var result = "0."
            for _ in 0..<Int(sub)!-1 { result.append("0") }
            result.append(temp)
            return result
        } else {
            return String(a)
        }
    }
    
     self.result.text = removeE(num: removeZero(num: printNum))

숫자를 입력했을 때의 해당 숫자나, 또는 연산 결과에 'e-'가 붙어 있는 경우는 모두 0.0000x로 표현되는 경우이다. 따라서 숫자에 e- 가 포함되었을 경우, 0.0000x 형태로 바꿔주는 removeE 함수를 추가하였다. 사용은 마지막 라인과 같이 하였다.

 

 

func whenSelectedOperator(_ num:Int) {
        if expressionArray.last != ")" && num != 6  || expressionArray.isEmpty && printNum != 0 {
            expressionArray.append(removeE(num: String(removeZero(num: printNum))))
        }
        switch num {
        case 6:
            if let test = expressionArray.last {
                if test != "+" && test != "-" && test != "*" && test != "/" && test != "%" {
                    expressionArray.append("*")
                }
            }
            expressionArray.append("(")
        default:
            break
        }
        self.history.text = expressionArray.joined(separator: " ")
        operation = num
        printNum = 0
        howManyInit()
    }

또한, 괄호를 눌렀을 때 괄호 앞에 어떠한 연산자라도 없으면 '*'를 추가하도록 구현하였다.

 

 

결과물

 

깨달은 점

계산기의 모든 기능은 구현하였다. 코드는 완성되었고 동작은 잘 하지만, 코드가 상당히 지저분하다. 분명히 필요없는 문장도 있을 것이며, 반복되는 부분도 많다. 계속 수정해 나가야 할 것이다. 이번 계산기를 만들면서 깨달은 것은 '큰 그림'이 없었다. 처음 버튼을 스토리보드에 올려두고 단순히 '구현해야지'라는 나이브한 생각을 가졌었다. 팀 프로젝트도 아니니 크게 문서화할 필요도 없었다. 그렇게 시작해서 사칙연산을 만들고, 혼합계산을 만들고, 괄호를 넣는 식으로 확장해나갔다. 그러나 최종 목표를 생각하고 모든 상황을 고려했다면 구현 시간이 많이 단축됐을 것이다. 괄호를 구현할 때부터 기본옵션으로 곱하기를 고려했다던가 사칙연산 때부터 혼합계산을 고려했다면 확장하기 쉬운 쪽으로 코드를 짰지 않았을까싶다. 교수님이 말씀하신 큰 그림이 없어서 아쉬웠다. 다음에 어떤 프로젝트를 구현할 때 이 점을 생각한다면 좀 더 훌륭한 프로그래머가 되지 않을까.

 

다음 구현 목표

오토레이아웃

 

 

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

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