일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 자바스크립트
- jQuery
- FLASK
- 웹
- ios
- spring
- iOS계산기
- Xib
- 스프링
- 앱배포
- 딩동말씀
- 앱버전구하기
- iOS배포
- 개발기록
- Python
- 계산기앱
- 파이썬서버
- 맥
- 스위프트
- iOS앱배포
- 계산기앱만들기
- AJAX
- Xcode
- DispatchGroup
- FileOwner
- Swift
- MainScheduler
- customclass
- subscript
- JavaScript
- Today
- Total
개발하는 뚝딱이
[iOS] 계산기 만들기 D+1 본문
iOS 계산기 만들기 개발 1일차
깃 허브 저장소 주소 ⤦
https://github.com/TheSongOfSongs/Calculator
왜 계산기를 만드는가
iOS를 시작하면서 스위프트 언어를 시작하였다. 객체지향 언어로는 JAVA와 C++를 다룬 적이 있으며, 형태는 javascript나 python과 비슷하여 쉽게 공부하는 중이다. 스위프트를 공부하면서 함께 코딩테스트도 준비 중인데 내가 푼 문제들과 다른 이들이 푼 코드에서 줄 수가 엄청 차이가 난다. 누군가는 한 줄의 return으로 끝낸 것도 많았고, 심지어 읽지도 못하는 것들로 가득하다. 차이점이 closure라는 것을 알았고 이를 더 잘 쓰기 위해, 개발 첫 앱을 '간단한 계산기'로 결정하였다. (시작해보니 생각보다 간단하지 않았다...)
시나리오
1. 기본 계산기 기능
- 숫자 0 ~ 9
- . (소수 표현)
- + - * / % +/- 연산
- C
- =
- 출력 레이블
2. 확장 기능
- ( ) 기능
- 출력 레이블 위에 수식 표현
구현 내용
출력 레이블은 printNum이라는 변수가 화면에 표시된다. 형태는 Int이며, 출력될 때 String으로 타입캐스팅 되도록 하였다.
1. 숫자 클릭했을 때
var printNum = 0
@IBOutlet var result: UILabel!
@IBAction func num1(_ sender: Any) { resultChange(1) }
func resultChange(_ a: Int) {
printNum = printNum * 10 + a
result.text = String(printNum)
}
func num1은 num0부터 num9까지 같은 형태로 만들어 각 버튼과 연결하였다. 숫자 버튼을 눌렀을 때 실행하는 함수는 resultChange(_ a: Int)로 현재 값과 이에 따른 결과를 출력 레이블까지 바꾸도록 하였다.
2. 연산자를 클릭했을 때
var operation = 0 // +1, -2, *3, /4, %5
@IBAction func plus(_ sender: Any) {
whenSelectedOperator(1)
}
@IBAction func clear(_ sender: Any) {
printNum = 0
result.text = "0"
}
@IBAction func toggle(_ sender: Any) {
printNum *= -1
result.text = String(printNum)
}
func whenSelectedOperator(_ num:Int) {
guard !isSelectedOperatior else {
return
}
isSelectedOperatior = true
operation = num
tempNum = printNum
printNum = 0
}
사칙연산자를 눌렀을 때 func plus(_ sender: Any) 각각 같은 형태로 실행된다. 이 때 whenSelectedOperator()의 인자는 1부터 5까지 각각으로 주었다.
whenSelectedOperator(_ num: Int)에서 연산자가 눌러져있는지 먼저 확인한다. 어떠한 연산자라도 눌러져있는 상태라면 함수 밖으로 나가고, 아니라면 현재 출력되어 있던 값을 tempNum 변수에 저장 후, printNum은 0으로 초기화한다.
3. 연산 기능 함수
@IBAction func print(_ sender: Any) {
switch operation {
case 1:
operateTwoNum(tempNum, printNum, operation: operateAdd)
case 2:
operateTwoNum(tempNum, printNum, operation: operateSub)
default:
break
}
operation = 0
isSelectedOperatior = false
}
func operateTwoNum(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) {
printNum = operation(a, b)
result.text = String(printNum)
}
var operateAdd: (Int, Int) -> Int = { $0 + $1 }
var operateSub: (Int, Int) -> Int = { $0 - $1 }
print(_sender: Any)는 '=' 버튼을 눌렀을 때 결과를 출력하도록 구현하였다. 연산과 출력을 하고, 더불어 아무 연산자도 선택되어 있지 않도록 변경하는 기능을 담당하는 함수이다. 사칙 연산과 나머지는 operateTwoNum 함수에 구하는 수 두 개와 클로저를 넣도록 만들었다. 클로저를 연습하기 위함이 아니라면, 굳이 operateTwoNum을 쓰는게 아니라 바로 함수 print(_ sender: Any)에서 값을 구해도 괜찮지 않을까. 함수가 길어지겠으나 여러 번 다른 함수를 호출하는 것과 비교했을 때 더 나을 것이다.
해결해야 할 과제
소수 기능을 위해서 Double을 사용해야 하는데 현재 계산하려는 값을 저장하는 printNum과 tempNum은 모두 Int로 지정되어 있다. 단순하게 타입 캐스팅으로 해결하려고 했을 때, 인자로 다른 함수로 넘겨질 때 타입 오류가 발생하여 불가능하다. 이를 해결해야 한다.
테스트 영상
'iOS 개발일지' 카테고리의 다른 글
[iOS] 계산기만들기 D+5 (0) | 2020.03.26 |
---|---|
[iOS] 환율계산기1 (0) | 2020.03.24 |
[iOS] 계산기만들기 D+4 (0) | 2020.03.12 |
[iOS] 계산기 만들기 D+3 (0) | 2020.03.10 |
[ios] 계산기 만들기 D+2 (0) | 2020.03.06 |