이번에는 수식이 완전하지 않은 상태에서(ex. 123+) "=" 버튼을 누르면
앱이 튕겨 버리는 현상이 발생했었습니다.
이게 기존코드입니다.
case "="를 보시면 잘못된 수식에 대한 처리 없이 함수를 바로 실행시킵니다. 그 결과로 앱이 꺼지는 현상이 발생했었습니다.
그래서 과제에서 주어진 calculate 함수를 확인했습니다.
뭐가 뭔지 도통 모르겠지만 우선 String 형태를 받고 Int? 타입으로 반환 해주네요.
그리고 뭔가 Int형으로 타입캐스팅이 불가능하면 nil을 리턴한다고 판단했습니다.
그래서 처음에는 이 표현식을 검증하는 함수를 만들자!로 접근했습니다.
func checkCalculate (expression: Int?) {
guard let expression = calculate(expression: 스트링값) else {return}
이런식으로 guard let 바인딩을 통해서 검증을 시도 했습니다.
하지만 결과는 앱이 꺼지지는 않지만 앱이 멈춰버렸습니다.
동일하게 작동을 안한것이지요...
그래서 대체 이 함수는 어떻게 동작하는가?에 대해 알기위해 playground를 켰습니다.
print로 출력값을 확인해보니 nil도 안나오고 알수없는 에러만 뱉어냅니다.
애초에 이 함수는 완성되지 않는 수식을 받으면 안되는거였습니다.
그래서 방향을 바꿉니다.
이전에 있었던 이슈에서 힌트를 얻어서 해결하기로 했습니다.
클릭하면 이동
이전에 있었던 이슈중 "연산자 기호 연속출력" 이라는 이슈가 있었습니다.
버튼이 눌렸을때 상태를 Bool값을 통해 변경해줌으로써 해결했었는데요.
이번 이슈도 동일하게 접근했습니다.
연산자를 입력하고 숫자가 입력되야만 calculate 함수를 실행시킨다.
이번에도 동일하게 연산자 버튼의 상태를 저장시킬수 있는 변수를 선언 시켜줬습니다. 기본값은 false입니다.
그리고 이 변수는
연산자 버튼이 눌리면 (default 케이스가 실행되면)true로 변경됩니다.
그리고 동시에 숫자 버튼 상태는 false로 변경됩니다.
그리고 다시 숫자 버튼이 눌리면 숫자버튼 상태는 true로 변경됩니다.
이걸 도대로 숫자 버튼 상태 = true , 연산자 버튼 상태 = true 일때만
calcuate 함수를 실행 하면 되겠다!로 결론 짓고
이걸 코드로 표현하면!!!!!!!!
이제 더 이상 앱이 종료되지 않음을 확인 할수 있습니다!!
이번꺼는 해결하니까 꽤나 짜릿했습니다.🥵
아주 기분이 좋네요.
근데
글쓰면서 다시 확인해보니까 이번에는 첫 연산이후 AC버튼을 누르면 연산자가 먼저 입력이 되어 버리네요.
추측으로는 default 문 if문에 조건이 하나 밖에 없어서 그런거 같습니다.
아니면 = 를 누르면 numberButtonTapped과 operationButtonTapped를 초기 상태인 false로 할당 해버리면 해결 할수 있을듯 합니다!!!!!