관리 메뉴

java,javascript,android,php,sql,공부용,메모용

계산기앱 기본적인 계산 / 프로퍼티에 값 저장/ 열거형 사용 본문

모바일/SwiftUI ios 공부

계산기앱 기본적인 계산 / 프로퍼티에 값 저장/ 열거형 사용

yy_dd2 2021. 12. 6. 21:29
반응형

열거형

https://tog-code.tistory.com/99

 

Main.Storyboard 정렬에

UIStackView, Axis(방향), Distributton(뷰의 사이즈 분배), Alignment(정렬), Spacing(값에 따라 스택뷰 간격 조정)

IBInspectable(커스텀 속성을 스토리보드에서 사용), IBDesignable(실시간으로 스토리보드에 적용됨)

"RoundButton"라는 UIButton 클래스를 만들어서 IBInspectable,IBDesignable을 사용함

 

관해서는 내용이 너무 길어서 정리하지 않고 바로 코드로

 

 

 

계산기 코드는 ViewController에서만 이루어졌다

주석참고
기억할 점은 값을 저장해서 다른곳에 또 대입해서 저장하고 연산을 하고 형변환 하는 과정을 기억하면 좋을듯함 기억 못하면 또 보면된다! 

//
//  ViewController.swift
//  Calculator
//
//  Created by yd on 2021/12/06.
//

import UIKit

// 열거형
enum Operation {
    case  Add
    case Subtract
    case Divide
    case Multiply
    case unKnown
}

class ViewController: UIViewController {

    @IBOutlet weak var numberOutputLabel: UILabel!
    
    // 계산기의 상태값 프로퍼티
    var  displayNumber = "" //numberOutputLabel 표시되는 숫자
    
    var firstOperand = ""   // 첫번째 피연산자 값/이전 계산값 저장하는 프로퍼티
    var secondOperand = ""  // 두번째 피연사자 값/새롭게 입력된 값을 저장함
    var result = "" // 계산의 결과값 저장
    var currentOperation : Operation    =   .unKnown    //  연산자를 저장/ 현재 계산기에 어떤 연산자가 입력되었는지 알 수 있도록
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    // 숫자버튼
    @IBAction func tapNumberButton(_ sender: UIButton) {
        guard let numberValue = sender.title(for: .normal) else {return}
        if self.displayNumber.count < 9 {
            self.displayNumber += numberValue
            self.numberOutputLabel.text = self.displayNumber
        }
    }
    // ac 버튼
    @IBAction func tapClearButton(_ sender: UIButton) {
        self.displayNumber  =   ""
        self.firstOperand   =   ""
        self.secondOperand  =   ""
        self.result =   ""
        self.currentOperation   =   .unKnown
        self.numberOutputLabel.text = "0"
    }
    // . 버튼
    @IBAction func tapDotButton(_ sender: UIButton) {
        if self.displayNumber.count < 8, !self.displayNumber.contains(".")  {// .이 포함되지 않으면
            self.displayNumber += self.displayNumber.isEmpty ? "0." :   "."   // displayNumber가 비어있으면  "0." 추가되고 그렇지 않으면 "."
            self.numberOutputLabel.text = self.displayNumber
        }
    }

    @IBAction func tapDivideButton(_ sender: UIButton) {                    // ÷
        self.Operation(.Divide)
    }
    
    @IBAction func tapMultiplyButton(_ sender: UIButton) {              // ×
        self.Operation(.Multiply)
    }
    
    @IBAction func tapSubtractButton(_ sender: UIButton) {          // −
        self.Operation(.Subtract)
    }
    
    @IBAction func tapAddButton(_ sender: UIButton) {                       // +
        self.Operation(.Add)
    }

    @IBAction func tapEqualButton(_ sender: UIButton) {                     // =
        self.Operation(self.currentOperation)
    }
    
    // 계산을 담당하는 함수
    func Operation(_ operation: Operation) {
        if self.currentOperation    !=  .unKnown    {
            if !self.displayNumber.isEmpty {     // 비어있지 않으면
                self.secondOperand  =   self.displayNumber      //  두번째 입렵받은값
                self.displayNumber  =   ""      //  결과값 선택 후 또 다시 초기화
                
                // 인트를 더블로 형변환 / 첫번째 두번째 피연산자(숫자)를 더블형으로 변경
                guard let firstOperand  =   Double(self.firstOperand)   else    {   return  }
                guard let secondOperand =   Double(self.secondOperand)  else    {   return  }
                
                //currentOperation 의 프로퍼티 값에 따라서 연산하는 코드
                switch self.currentOperation    {
                case .Add:
                    self.result =   "\(firstOperand + secondOperand)"
                    
                case .Subtract:
                    self.result =   "\(firstOperand - secondOperand)"
                    
                case .Divide:
                    self.result =   "\(firstOperand / secondOperand)"
                    
                case .Multiply:
                    self.result =   "\(firstOperand * secondOperand)"
                    
                default:
                    break
                }
                
                // 더블형으로 변환해서 소숫점 값이 0이면 int로 변환하여 표시
                if let result   =   Double(self.result),    result.truncatingRemainder(dividingBy: 1)   ==  0{
                    self.result =   "\(Int(result))"
                }
                // 연산을 여러번 할 수 있기 때문에 연산의 계산 값을 첫번째 피연산자값에 다시저장
                self.firstOperand   =   self.result
                self.numberOutputLabel.text  =   self.result
            }   //end if !self.displayNumber.isEmpty {     // 비어있지 않으면
            
            // 함수 파라미터로 전달한 연산자값을 currentOperation 저장
            self.currentOperation   =   operation
            
        }   else {
            self.firstOperand   =   self.displayNumber      // 번호 저장
            self.currentOperation   =   operation                       // 선택한 연산자 저장
            self.displayNumber  =   ""                                          //  빈문자로 초기화 -> 이다음 숫자를 누르면 새숫자가 나오도록
            
        }
    }
    
}
반응형
Comments