3주차 과제 계산기 어플을 제작하며 생겼던 문제 해결과정

이진욱(JIN WOOK)·2024년 11월 19일
0

과제에관하여

목록 보기
5/6

LV.8 까지 해결하면서 생긴 문제에 대해서 다루고자 합니다!

저는 제작하며 총 3개의 문제가 발생했습니다.

  • 레이블의 너비를 벗어나면 텍스트가 표시가 안되는문제
  • AC버튼의 비정상 작동
  • 연산자 기호가 연속적으로 출력되는 문제

레이블의 너비를 벗어나면 텍스트가 표시가 안되는문제

버튼을 누른값이 레이블의 너비가 초과되면 ... 이렇게 표시되는 문제가 있었습니다.

스토리 보드로 UI를 작성했었으면 레이블에 AutoShrink라는 설정을 적용하면 됐었는데 (자동으로 폰트 크기 조정을 해주는 기능입니다.)
이번엔 코드 베이스로 제작을 시도해서 해당 기능과 비슷한 문제를 찾아야 했습니다.
다행히 구글에 UILabel AutoShrink 라는 키워드를 검색하니

바로 공식문서가 나왔습니다.

내부에 한줄의 코드를 추가함으로써 간단하게 문제를 해결할수 있었습니다.


AC버튼 비정상 작동

계산기 과제의 조건중 "AC버튼을 누르면 모든값을 지우고 0으로 초기화" 라는게 있었습니다.

저는 처음에 단순히 버튼을 누르면 메인 레이블에 0을 표시하는 방법으로 구현을 했었어요.

이렇게 구현을 하니까 AC버튼을 눌렀을때 메인레이블에 0이 표시가 되긴하지만
누른후 다시 숫자 입력을 하면 기존에 눌렸던 숫자들이 표시 됐었습니다.
왜냐하면 입력을 저장하는 변수인 accumulateNumberButton가 실제로는 초기화가 되지 않고 계속 입력값을 누적시켰기 때문이였어요.

그래서 AC버튼을 누르면 accumulateNumberButton을 파라미터로 전달해서 완전히 초기화 시키는 함수를 만들자 라는 생각으로 시작해서

resetAll라는 함수를 생성했습니다.

func resetAll(accumulateButton: String)

이런식으로 코드를 작성해서 전달된 파라미터를 초기화 시키려 했는데
"파라미터는 let 이라 수정할수 없습니다." 라고 에러메세지가 떳습니다.
그러다가 전에 공부한 inout 키워드가 생각이 났습니다.
https://velog.io/@jwl-98/inout-키워드


수정된 코드는 이와 같습니다.
아예 원본 데이터를 전달 받아서 원본데이터를 "" 라는 값으로 변경해 주는 식으로 구현해서 해결했습니다.


연산자 기호가 연속적으로 출력되는 문제

계산기는 이러면 안됩니다..

왜 이런문제가 발생했을까요?
기존에는 이렇게 코드를 작성했었습니다.

case "+":
            accumulateButton(buttonText: buttonTitle)
        case "-":
            accumulateButton(buttonText: buttonTitle)
        case "*":
            accumulateButton(buttonText: buttonTitle)
        case "/":
            accumulateButton(buttonText: buttonTitle)
        default :
            accumulateButton(buttonText: buttonTitle)

switch문 내부에 단순하게 연산자 기호를 출력해주고자
연산자 기호 별로 버튼레이블을 누적시키는 함수를 실행 시키게 코드를 작성했었습니다.
이렇게 되버리면 생각없이 연산자 기호도 그냥 누적시켜 출력 해버립니다.


그래서 대략적으로 이런 해결방법을 구현하겠다고 생각했습니다.

"숫자 버튼을 누른후에만 연산자 버튼을 표시하고 누적시긴다"

이 로직을 구현하기위해선 한 스위치 문에 모든걸 처리하는게 아니라
연산자 기호를 처리하기 위한 함수를 생성 해줬어야 했습니다.

좀 더 로직을 구체화 시켜서 입력전과 입력후를 구분해 줘야겠다고 생각했습니다.
입력전 - 연산자 기호 함수 호출 X
입력후 - 연산자 기호 함수 딱 한번 호출

그 결과로

var userTypingNumberButton = false

해당 변수를 선언하고 기본값은 false로 저장시켜줬습니다.

숫자 버튼을 누르면 true로 값을 변경시켜줍니다.
그렇게 되면 default문내 연산자 처리 함수를 실행 해주고
다시 기본값인 false로 변경해줍니다.

해당 로직을 추가해줌으로써 문제를 해결할수 있었습니다.

역시 이번에도 아주 재밌는 과제였습니다.
이번에도 폴더 분리를 도전해볼 생각입니다.

profile
기술로부터 소외 되는 사람이 없도록 우리 모두를 위한 서비스를 만들고 싶습니다.

0개의 댓글

관련 채용 정보