프로젝트 만들어보기

[iOS] 계산기 만들어보기 (Swift)

데브킹덕 2022. 10. 6. 12:47

결과

 

 

 

배운점

- 연관성이 있는 값을 모아놓은 원시값이 없는 열거형 Circulate 만들어 사용해봄

 

- truncatingRemainder 메서드 사용

  other로 나눈 값의 나머지를 반환하는 메서드를 사용 

 

 

 

UIStackView 사용

Axis - 스택뷰의 방향을 결정

Distribution -  옵션에 따라 View들의 사이즈를 분배

Alignment  - 정렬

Spacing - 간격조정

 

 

 

 

 

IBInspectable

커스텀뷰 속성을 스토리보드에서 바로 변경할 수 있음

즉 인스펙터에 내가 원하는 Attribute를 추가 하고 싶을때 사용

Attribute는 get,set이 가능한 프로퍼티여야 함 

 

IBDesignable

변경된 속성이 실시간으로 적용되는 것을 볼 수 있음 

 

 

참고)

IB = Interface Builder - 스토리보드를 뜻함 

장점

- Custom View를 만들때마다 실제 빌드를  돌려서 직접 확인하지 않아도 됨

- UI관련 내용을 스토리보드에서 깔끔하게 한번에 정의가능

 

단점

- 무분별하게 사용하면 느려짐 

 

 

 

변수

pressedDB = 보여지는 문자열

firstDB = 첫 문자열를 담을 문자열

secondDB = 두번째 문자열을 담을 문자열

result = 결과를 나타낼 문자열

circulateDB는 Circulate 자료형을 가짐

//
//  DuckCalculatorViewController.swift
//  Calculator
//
//  Created by duck on 2022/10/04.
//

import UIKit

enum Circulate{
    case Add
    case Minus
    case Divide
    case Multiply
    case unknown
}

class DuckCalculatorViewController: UIViewController {
    
    
    var pressedDB = ""
    var firstDB = ""
    var secondDB = ""
    var result = ""
    var circulateDB: Circulate = .unknown

    //MARK: IBOutlet
    @IBOutlet weak var resultLabel: UILabel!
    
    //MARK: IBAction
    @IBAction func clearButton(_ sender: UIButton) {
        self.pressedDB = ""
        self.firstDB = ""
        self.secondDB = ""
        self.result = ""
        self.circulateDB = .unknown
        self.resultLabel.text = "0"
    }
    
    @IBAction func addButton(_ sender: UIButton) {
        self.circulate(.Add)
    }
    
    @IBAction func minusButton(_ sender: UIButton) {
        self.circulate(.Minus)
    }
    
    @IBAction func multiplyButton(_ sender: UIButton) {
        self.circulate(.Multiply)
    }
    
    @IBAction func divideButton(_ sender: UIButton) {
        self.circulate(.Divide)
    }
    @IBAction func equalButton(_ sender: UIButton) {
        self.circulate(self.circulateDB)
      
    }
    
    @IBAction func dotButton(_ sender: UIButton) {
        if self.pressedDB.count < 8, !self.pressedDB.contains("."){
            self.pressedDB += self.pressedDB.isEmpty ? "0." : "."
            self.resultLabel.text = self.pressedDB
        }
    }
    
    @IBAction func numberButton(_ sender: UIButton) {
        guard let senderTitle = sender.title(for: .normal) else {return}
        
        if pressedDB.count < 9{
        self.pressedDB += senderTitle
        self.resultLabel.text = pressedDB
    
        }
    }
    
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

         }
    
    
    func circulate(_ operation: Circulate){
        if self.circulateDB != .unknown{
            if !self.pressedDB.isEmpty{
                self.secondDB = self.pressedDB
                self.pressedDB = ""
                
                guard let firstOperand = Double(self.firstDB) else {return}
                guard let secondOperand = Double(self.secondDB) else {return}
                
                switch self.circulateDB {
                case .Add:
                    self.result = "\(firstOperand + secondOperand)"
                case .Minus:
                    self.result = "\(firstOperand - secondOperand)"
                case .Divide:
                    self.result = "\(firstOperand / secondOperand)"
                case .Multiply:
                    self.result = "\(firstOperand * secondOperand)"
                default:
                    break
                }
                if let result = Double(self.result),result.truncatingRemainder(dividingBy: 1) == 0{
                    self.result = "\(Int(result))"
                }
                
                self.firstDB = self.result
                self.resultLabel.text = self.result
            }
            self.circulateDB = operation
        }else{
            self.firstDB = self.pressedDB
            self.circulateDB = operation
            self.pressedDB = ""
        }
    }
}