5-3 TroubleShooting

STONE·2024년 11월 20일

Swift_Ios

목록 보기
18/44

주제

계산기 TroubleShooting

배경

level 1 : UILabel을 사용해서 수식을 표시할 수 있는 라벨을 띄우기
level 2 : UIStackView을 사용해서 4개의 버튼을 모아 가로 스택뷰 생성
level 3 : UIStackView을 사요해서 세로 스택 뷰 생성
level 4 : 연산 버튼 ( +, -, *, /, AC, =)들 orange로 설정
level 5 : 모든 버튼 원형으로 만들기
level 6 : 버튼을 클릭하면 label 공간에 표시
level 7 : 초기화 버튼 AC를 구현
level 8 : 등호(=)버튼을 클릭하면 연산이 수행되도록 구현

발단

처음 사칙연산 기능을 만들었을때 +, -, *, / 숫자 두개연산 (ex: 1+2, 4-3)등 단순한 숫자 계산이 가능했다. 하지만 1+2+3을 계산할 때 1+2+3=6 이라는 계산이 아니라 1+2+3에서 2+3만 계산이 되어 5가 출력되었다

전개

이런 문제를 해결하기 위해 1+2+3을 계산할 때 이전 값이 있으면 먼저 계산해놓고 그 다음 수를 계산했다.

위기

하지만 1+2+3, 1-2+3등 우선순위를 걱정하지 않아도 되는 계산식은 계산이 되었지만, (1 + 2 3), 2+22등 우선순위가 필요한 복합 계산식은 계산이 앞쪽부터 계산이 되어 (1+2)*3으로 계산이 되었다

절정

저 문제를 해결해 보기 위해 썻던 방법
1. 저 계산식을 스택으로 받아서 ( * ), ( / ) 곱하기 나누기를 먼저 우선순위를 두고 계산을 하고 계산에 사용한 연산자와, 피연산자를 삭제하고 계산한 값을 스택에 넣고 하는 과정으로 풀어보려 했으나 너무 복잡함
2. NSExpression을 사용한 연산 방법
문자열로 표현된 산술 수식을 평가하는 간단한 유틸리티 함수이다

// NSExpression 사용
let expression = NSExpression(format: expression)
// 문자열 형식으로 수식을 정의하고 이를 평가하는 객체입니다.
// (ex : 1+2*3)을 파싱하여 수식 객체로 변환합니다.

if let result = expression.expressionValue(with: nil, context: nil) as? Int {
        return result
}
// 수식의 값을 평가합니다
// context는 값 평가를 위한 정보
// 결과를 Int반환 실패시 nil을 반환


func calculate(expression: String) -> Int? {
	    let expression = NSExpression(format: expression)
    if let result = expression.expressionValue(with: nil, context: nil) as? Int {
        return result
    } else {
        return nil
    }
}

결말


우선순위가 필요한 계산식도 계산가능, 복잡한 방법으로 계산했어야 될 과정을 Swift의 함수 하나로 정리가 가능하다.

profile
흠...?

0개의 댓글