개발하는 동글 :]

[TIL],[UIkit] 계산기 사칙연산 로직_수정 본문

카테고리 없음

[TIL],[UIkit] 계산기 사칙연산 로직_수정

동글하다 2023. 7. 23. 15:48

음수 계산이 되지 않았던 기존의 방식은 문자열을 배열로 만들 때 숫자인지 아닌지를 기준으로 분리를 했었다. 하지만 그렇게 할 시 음수가 배열에 저장되면 부호를 따로 빼서 저장을 하는 문제가 발생하였었기에 부호를 추가할 때 양 옆으로 공백의 문자열을 추가한 뒤 배열로 만들 때 공백을 기준으로 배열을 만들어보니 문제가 해결 되었다.

//
//  ViewController.swift
//  fisrtCalcu
//
//  Created by SeoJunYoung on 2023/07/17.
//

import UIKit

class ViewController: UIViewController {
    
    var buttonTitle = ["7","8","9","+/-","4","5","6","*","1","2","3","/","0",".","AC","="]
    var dataManager = DataManager(nowNum: "")
    
    let contentView: UIView = {
       let contentView = UIView()
        contentView.translatesAutoresizingMaskIntoConstraints = false
        contentView.backgroundColor = UIColor.black
        return contentView
    }()
    
    let disPlayView: UIView = {
        let disPlayView = UIView()
        disPlayView.translatesAutoresizingMaskIntoConstraints = false
        disPlayView.backgroundColor = UIColor.white
        return disPlayView
    }()
    
    let disPlayLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = ""
        label.textAlignment = NSTextAlignment.right
        label.font = UIFont.boldSystemFont(ofSize: 30)
        label.textColor = UIColor.black
        return label
    }()
    
    let slideView: UICollectionView = {
        
        let flowLayout = UICollectionViewFlowLayout()
        flowLayout.itemSize = CGSize(width: 50 , height: 50)
        flowLayout.sectionInset = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.backgroundColor = UIColor.black
        return collectionView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }

    func setupUI(){
        contantVIewUI()
        disPlayViewUI()
        slideViewUI()
    }

    func contantVIewUI(){
        view.addSubview(contentView)
        NSLayoutConstraint.activate([
            contentView.topAnchor.constraint(equalTo: view.topAnchor),
            contentView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            contentView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            contentView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
        ])
    }
    func disPlayViewUI(){
        contentView.addSubview(disPlayView)
        NSLayoutConstraint.activate([
            disPlayView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 100),
            disPlayView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),
            disPlayView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10),
            disPlayView.heightAnchor.constraint(equalToConstant: 150)
        ])
        disPlayView.addSubview(disPlayLabel)
        NSLayoutConstraint.activate([
            disPlayLabel.topAnchor.constraint(equalTo: disPlayView.topAnchor, constant: 10),
            disPlayLabel.leadingAnchor.constraint(equalTo: disPlayView.leadingAnchor, constant: 10),
            disPlayLabel.trailingAnchor.constraint(equalTo: disPlayView.trailingAnchor, constant: -10),
            disPlayLabel.bottomAnchor.constraint(equalTo: disPlayView.bottomAnchor, constant: -10)
        ])
    }
    func slideViewUI(){
        contentView.addSubview(slideView)
        slideView.dataSource = self
        slideView.delegate = self
        slideView.register(ButtonCell.self, forCellWithReuseIdentifier: "ButtonCell")
        NSLayoutConstraint.activate([
            slideView.topAnchor.constraint(equalTo: disPlayView.bottomAnchor, constant: 50),
            slideView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
            slideView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
            slideView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
        ])
    }
    
    
}
    

extension ViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView,
            layout collectionViewLayout: UICollectionViewLayout,
            sizeForItemAt indexPath: IndexPath) -> CGSize {

                let interval:CGFloat = 5
                let width: CGFloat = ( UIScreen.main.bounds.width - interval * 2 ) / 5
                return CGSize(width: width , height: width + 30)
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return buttonTitle.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
        if collectionView == slideView{
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ButtonCell", for: indexPath) as! ButtonCell
            cell.button.setTitle(buttonTitle[indexPath.row], for: .normal)
            var myColor = ["+/-","*","/","=","AC"].contains(buttonTitle[indexPath.row]) ? UIColor.yellow : UIColor.gray
            cell.contantView.backgroundColor = myColor
            cell.button.setTitleColor(UIColor.black, for: .normal)
            cell.button.isHighlighted = false
            cell.button.addTarget(self, action: #selector(self.buttonAction), for: .touchUpInside)
            return cell
        }
        
        return UICollectionViewCell()
    }
    
    @objc func buttonAction(_ sender: UIButton){
        
        guard let num = sender.titleLabel?.text else { return }
        
        if num == "="{
            dataManager.getResult()
            self.disPlayLabel.text = dataManager.nowNum
            dataManager.calToggle = true
            dataManager.isInputNow = false
        } else if num == "AC"{ //완료
            dataManager.nowNum = ""
            self.disPlayLabel.text = dataManager.nowNum
            dataManager.calToggle = true
            dataManager.isInputNow = false
        } else if num == "+/-"{
            var type = dataManager.calToggle ? " + " : " - "
            
            if dataManager.calToggle{
                if dataManager.isInputNow{
                    dataManager.nowNum.popLast()
                    dataManager.nowNum.popLast()
                    dataManager.nowNum.popLast()
                    dataManager.nowNum += type
                    self.disPlayLabel.text = dataManager.nowNum
                } else {
                    dataManager.nowNum += type
                    self.disPlayLabel.text = dataManager.nowNum
                }
            } else {
                dataManager.nowNum.popLast()
                dataManager.nowNum.popLast()
                dataManager.nowNum.popLast()
                dataManager.nowNum += type
                self.disPlayLabel.text = dataManager.nowNum
                dataManager.isInputNow = true
            }
            
            dataManager.calToggle.toggle()
        } else if num == "*"{
            if dataManager.nowNum.count == 0{
                dataManager.nowNum += " " + num + " "
                self.disPlayLabel.text = dataManager.nowNum
            } else {
                guard let lastChar = dataManager.nowNum.last else{ return }
                if lastChar.isNumber{
                    dataManager.nowNum += " " + num + " "
                    self.disPlayLabel.text = dataManager.nowNum
                } else {
                    dataManager.nowNum.popLast()
                    dataManager.nowNum += " " + num + " "
                    self.disPlayLabel.text = dataManager.nowNum
                }
            }
            dataManager.calToggle = true
            dataManager.isInputNow = false
        } else if num == "/"{
            if dataManager.nowNum.count == 0{
                dataManager.nowNum += " " + num + " "
                self.disPlayLabel.text = dataManager.nowNum
            } else {
                guard let lastChar = dataManager.nowNum.last else{ return }
                if lastChar.isNumber{
                    dataManager.nowNum += " " + num + " "
                    self.disPlayLabel.text = dataManager.nowNum
                } else {
                    dataManager.nowNum.popLast()
                    dataManager.nowNum += " " + num + " "
                    self.disPlayLabel.text = dataManager.nowNum
                }
            }
            dataManager.calToggle = true
            dataManager.isInputNow = false
        } else { //완료
            dataManager.nowNum += num 
            self.disPlayLabel.text = dataManager.nowNum
            dataManager.calToggle = true
            dataManager.isInputNow = false
        }
        
    }
    
}
//
//  DataManager.swift
//  CoupangClon
//
//  Created by SeoJunYoung on 2023/02/10.
//

import UIKit

class DataManager {
    
    var nowNum: String
    var numsAry:[Double] = []
    var calToggle = true
    var isInputNow = false
    
    init(nowNum:String){
        self.nowNum = nowNum
    }
    
    func mul(_ array:[String]) -> [String]{
        var result = array
        var index = 0
        //print("mul:\(result)")
        while result.contains("*"){
            if result[index] == "*"{
                result[index - 1] = String(
                    Double(Int(Double(result[index - 1])! * Double(result[index + 1])! * 100)) / 100
                )
                result.remove(at:index)
                result.remove(at:index)
                index = 0
            }
            index += 1
        }
        //print("mul:\(result)")
        return result
    }
    
    func div(_ array:[String]) -> [String]{
        var result = array
        var count = 0
        //print("div:\(result)")
        while result.contains("/"){
            if result[count] == "/"{
                result[count - 1] = String(
                    Double(Int(Double(result[count - 1])! / Double(result[count + 1])! * 100)) / 100
                )
                result.remove(at:count)
                result.remove(at:count)
                count = 0
            }
            count += 1
        }
        //print("div:\(result)")
        return result
    }
    func sum(_ array:[String]) -> [String]{
        var result = array
        var count = 0
        //print("sum:\(result)")
        while result.contains("+"){
            if result[count] == "+"{
                result[count - 1] = String(Double(result[count - 1])! + Double(result[count + 1])!)
                result.remove(at:count)
                result.remove(at:count)
                count = 0
            }
            count += 1
        }
        //print("sum:\(result)")
        return result
    }
    func sub(_ array:[String]) -> [String]{
        var result = array
        var count = 0
        print("sub:\(result)")
        while result.contains("-"){
            if result[count] == "-"{
                result[count - 1] = String(Double(result[count - 1])! - Double(result[count + 1])!)
                result.remove(at:count)
                result.remove(at:count)
                count = 0
            }
            count += 1
        }
        //print("sub:\(result)")
        return result
    }
    func getResult(){
        var array:[String] = nowNum.components(separatedBy: " ")
        var result = sum(sub(div(mul(array)))).reduce("",+)
        
        var answer = Double(result)! == Double(Int(Double(result)!)) ? String(Int(Double(result)!)) : String(Double(result)!)
        self.nowNum = answer
    }



    
}