일반적인 연산자와 동일하게 아래의 코드로 작성했는데, 오류가 발생했다.
case "%%":
return fn % num2
🚫 '%’ is unavailable: For floating point numbers use truncatingRemainder instead
나머지(%) 연산자는 사용이 불가능하다는 에러였고, 해결방법은 truncatingRemainder를 사용하라는 말이었다.
나머지 연산자는 정수형(Int)에서만 적용이 가능하고, fn와 num2는 Double형이기 때문에 사용이 불가능했다.
그렇다고 fn와 num2를 Int형으로 받을 순 없기때문에 에러메세지를 참조해서 코드를 수정했다.
case "%%":
return fn.truncatingRemainder(dividingBy: num2)
Swift에서는 소수점을 4가지로 처리할 수 있다.
그러나 계산값의 소수점이 길어지면 ... 으로 표현이 되는데, format을 지정해서 소수점 n번째까지만 반환할 수 있다.
result 값은 디스플레이에 문자열로 보여줘야하니까 String으로 형태를 변환했다.
String(format: ".%nf", result)
그런데 문제는 result 값을 Double 형으로 받기 때문에 소수점이 없는 계산값도 .0 (0은 n개)가 붙어서 나오더라.
그래서 나머지를 구하는 방법을 통해 소수점 이하를 잘라내는 메서드를 resultTouched 함수에 추가해서 문제를 해결했다.
소수점이 나오지 않는 계산식은 값을 1로 나누었을 때 나머지가 0이므로 해당 결과값을 정의한 코드를 추가했다.
let isDecimal = result.truncatingRemainder(dividingBy: 1) != 0
if isDecimal {
display.text = String(result)
} else {
display.text = String(Int(result))
}
※ 주의사항
1로 나누든 안나누든 결과값 display.text = String(result)은 Double의 형태이기 때문에 나머지가 0인 경우는 정수형(Int)로 반환하는 코드로 수정해야 .0이 안나온다.
오늘의 고민거리는 조건문의 return 값이다.
나는 조건문 반환을 값 자체를 return 하게 작성했는데, 다른 조에서는 값을 배정하고 그 값에 계산식을 넣어서 반환했다고 한다.
switch operatorSymbol {
case "+":
return fn + num2
case "-":
return fn - num2
case "×":
return fn * num2
case "÷":
if num2 != 0 {
return fn / num2
} else {
print("ERROR: Division by zero")
return nil
}
case "%%":
return fn.truncatingRemainder(dividingBy: num2)
default:
print("ERROR")
return nil
}
값 자체를 return 하는게 좀 더 효율적이고 코드를 줄일 수 있다고 생각했는데, 확장성을 고려하면 변수를 할당하는 방법도 나쁘지 않을 것 같다는 생각을 하게 된다.
둘의 장단점을 정리해보자면 다음과 같다.
일단 이번 프로젝트인 계산기를 구현할 때는 값 자체를 반환하는게 직관적이고 코드도 짧은데, 조건문이 길어지거나 계산식의 가공을 해야한다면 변수를 할당하는게 좋겠다.
어떤 조건문을 만들건지에 따라서 선택적으로 활용하는게 제일 베스트인 듯!