카테고리 없음

23년 7월 17~21일 WIL - Calculator

jjjkh 2023. 7. 22. 16:20

이번주에는 처음으로 Xcode를 사용하여 Swift에서 계산기를 만들어 보았다.

 

Calculator 구현 영상

Calculator의 버튼들은 스타일보드을 이용하여 구현하였고 내부 기능들은 cal.swift 와 viewcontroller.swift로 나누어 코드를 작성해 보았다.

 

viewcontroller.swift

//
//  ViewController.swift
//  calculator
//
//  Created by 정기현 on 2023/07/19.
//
import UIKit

class ViewController: UIViewController {
    var sum = Double();
    var num = Double();
    var isPlus = false;
    var isMinus = false;
    var isMultiply = false;
    var isDiv = false;
    var userTyping = false;
    var operatorSymbol: String?
    var cal = Calculator()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        display.layer.cornerRadius = 20
        display.layer.masksToBounds = true
   
    }
    //    숫자 라벨
    @IBOutlet weak var display: UILabel!
    
    
    var userIsInTheMiddleOfTyping = false
    //    숫자 버튼
    @IBAction func btn(_ sender: UIButton) {
        
        if( display.text == "0"){
            display.text = ""
        }
        
        let dight = sender.currentTitle!
        print("thouched \(dight) dight");
        if userTyping {
            let textCurrentDisplay = display.text!
            display.text = textCurrentDisplay + dight
        }else{
            display.text = dight
        }
        userTyping = true;
    }
    //    C 초기화 버튼
    @IBAction func clear(_ sender: UIButton) {
        display.text = "0"
        sum = 0;
        
    }
    //    = 을 눌렀을때
    @IBAction func result(_ sender: UIButton) {
        
        num = Double(display.text!)!
        let res = cal.calculate(firstNumber: sum,operatorSymbol: operatorSymbol!, secondNumber: num)
        
        sum = res!
        display.text = String(res!)
        num = 0
        isPlus = false
        isDiv = false
        isMultiply = false
        isMinus = false
    }
    
    //    +버튼
    @IBAction func plus(_ sender: UIButton) {
        if(isPlus==false){
            sum = Double(display.text!)!
            operatorSymbol = "+"
            print("sum",sum)
            userTyping = false
            isDiv = false
            isMinus = false
            isMultiply = false
            
            isPlus = true
            display.text = "0"
        }
    }
    
    //    -버튼
    @IBAction func minus(_ sender: UIButton) {
        if(isMinus==false){
            sum = Double(display.text!)!
            operatorSymbol = "-"
            print("sum",sum)
            userTyping = false
            isDiv = false
            isPlus = false
            isMultiply = false
            
            isMinus = true
            display.text = "0"
        }
    }
    
    //    x버튼
    @IBAction func multiply(_ sender: UIButton) {
        if(isMultiply==false){
            sum = Double(display.text!)!
            operatorSymbol = "*"
            print("sum",sum)
            userTyping = false
            isDiv = false
            isMinus = false
            isPlus = false
            
            isMultiply = true
            display.text = "0"
        }
    }
    
    //    /버튼
    @IBAction func divide(_ sender: UIButton) {
        if(isDiv==false){
            sum = Double(display.text!)!
            operatorSymbol = "/"
            print("sum",sum,"num",num)
            userTyping = false
            isPlus = false
            isMinus = false
            isMultiply = false
            
            isDiv = true
            display.text = "0"
            
        }
    }
}

cal.swift 

//
//  cal.swift
//  calculator
//
//  Created by 정기현 on 2023/07/19.
//
//

class Calculator {
    var add = AddOperation()
    var sub = SubtractOperation()
    var mul = MultiplyOperation()
    var div = DivideOperation()
    func calculate(firstNumber: Double?,operatorSymbol: String,  secondNumber: Double) -> Double? {
        guard let fn = firstNumber else {
            return nil
        }
        print(operatorSymbol)
        switch operatorSymbol {
        case "+": print(fn, secondNumber)
            return add.calculate(firstNumber: fn, secondNumber: secondNumber)
        case "-":
            return sub.calculate(firstNumber: fn, secondNumber: secondNumber)
        case "*":
            return mul.calculate(firstNumber: fn, secondNumber: secondNumber)
        case "/":
            return div.calculate(firstNumber: fn, secondNumber: secondNumber)
        default:
            print("ERROR")
            return 0
        }
    }
}
// + class
class AddOperation{
    func calculate(firstNumber: Double, secondNumber: Double) -> Double {return firstNumber != 0 ? firstNumber + secondNumber : 0}
}
// - class
class SubtractOperation{
    func calculate(firstNumber: Double, secondNumber: Double) -> Double {return firstNumber != 0 ? firstNumber - secondNumber : 0}
}
// * class
class MultiplyOperation{
    func calculate(firstNumber: Double, secondNumber: Double) -> Double {return firstNumber != 0 ? firstNumber * secondNumber : 0}
}
// / class
class DivideOperation{
    func calculate(firstNumber: Double, secondNumber: Double) -> Double {return firstNumber != 0 ? firstNumber / secondNumber : 0}
}

 

위와 같은 방식으로 코드를 구현했다. 

간단히 코드를 설명해보면 숫자버튼을 누르면 그 값을 라벨에 보여주고 각 +,-,x,/ 를 누르게 되면 전에 계산하려던 값을 sum이라는 값에 저장해두고 그 다음 값을 num에 저장하여 =을 누르게 되면 각 연산에 맞게 연산을 하게 하고 C(초기화) 버튼을 누르게 되면 라벨의 text값에 0을 넣어주어 초기화를 시키게 해주었다. 연산에 대한 부분은 cal.swift로 파일을 분리하여 claculator라는 class에서 연산자에 따른 각각의 연산 class를 만들어 주고 switch문을 이용하여 연산에 맞는 연산 class를 참조하여 계산하게 해주었다.

 

어려웠던점.

초기에 viewcontroller 클래스와 claculator의 클래스 서로를 불러오는 코드를 작성하였더니 강한참조에 대한 에러가 발생하게 되었는데 강한 참조를 약한 참조로 바꾸기위해 여러가지를 찾아보고 시도 해보았지만 해결하지 못하여서 결국 한쪽의 클래스에서 코드를 작성하여 오류를 해결했다. 

 

아쉬운 점

계산기를 만들면서 구현하지 못한 기능들이 있는데 3x7x2-9 같이 = 버튼을 누르지 않고 계산을 하는 기능과 3버튼을 누르고 / - 버튼을 누르는 것과 같이 연산자 버튼을 눌렀을 때의 오류를 해결하지 못한 점이 있다. 이런 기능과 오류를 해결하지 못한점이 아쉽지만 앞으로 더 학습해 나가면서 더 많은 기능을 추가 할 수 있도록 노력해야겠다.