[Swift][내배캠] iOS 주특기 입문 강의 - 과제 (Snapkit Base)

팔랑이·2024년 6월 25일
0

iOS/Swift

목록 보기
38/71
post-thumbnail

스토리보드를 적극 사용해 해결한 과제는 여기에서 확인


CalculatorViewController.swift

import UIKit
import SnapKit

class CalculatorViewController: UIViewController {
    
    var numLabel = UILabel()
    var logics = Logics()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .black
        configNumLabel()
        configStackView()
    }
    
    @objc func buttonTapped(_ sender: UIButton){
        if let buttontitle = sender.titleLabel?.text {
            numLabel.text = logics.tapButton(buttontitle)
        }
    }
    
    func configNumLabel() {
        view.backgroundColor = .black
        numLabel.textColor = .white
        numLabel.text = "0"
        numLabel.textAlignment = .right
        numLabel.font = .boldSystemFont(ofSize: 60)
        view.addSubview(numLabel)
        
        numLabel.snp.makeConstraints {
            $0.top.equalToSuperview().offset(200)
            $0.leading.equalToSuperview().offset(30)
            $0.trailing.equalToSuperview().offset(-30)
            $0.height.equalTo(100)
        }
    }
    
    func makeHorizontalStackView(_ views: [UIView]) -> UIStackView {
        let horizontalButtonStack = UIStackView(arrangedSubviews: views)
        horizontalButtonStack.axis = .horizontal
        horizontalButtonStack.backgroundColor = .black
        horizontalButtonStack.spacing = 10
        horizontalButtonStack.distribution = .fillEqually
        return horizontalButtonStack
    }
    
    func configStackView() {
        let buttonTitles : [[String]] = [
        ["7", "8", "9", "+"],
        ["4", "5", "6", "-"],
        ["1", "2", "3", "*"],
        ["AC", "0", "=", "/"]]
        
        let verticalButtonStack = UIStackView()
        verticalButtonStack.axis = .vertical
        verticalButtonStack.backgroundColor = .black
        verticalButtonStack.spacing = 10
        verticalButtonStack.distribution = .fillEqually
        view.addSubview(verticalButtonStack)
        
        verticalButtonStack.snp.makeConstraints{
            $0.width.equalTo(350)
            $0.top.equalTo(numLabel.snp.bottom).offset(60)
            $0.centerX.equalToSuperview()
        }
        
        for i in buttonTitles {
            let button = i.map{String($0)}
            var horizontalButtonArr = [UIView]()
            button.forEach{ j in horizontalButtonArr.append(makeButtons(titleValue: j, action: #selector(buttonTapped) , backgroundColor: configButtonColor(j)))}
            let stack = makeHorizontalStackView(horizontalButtonArr)
            verticalButtonStack.addArrangedSubview(stack)
        }
    }
    
    func makeButtons(titleValue: String, action: Selector, backgroundColor: UIColor) -> UIButton {
        let button = UIButton()
        button.setTitle(titleValue, for: .normal)
        button.titleLabel?.font = .boldSystemFont(ofSize: 30)
        button.backgroundColor = backgroundColor
        button.layer.cornerRadius = 40
        button.snp.makeConstraints{
            $0.height.equalTo(80)
            $0.width.equalTo(80)
        }
        button.addTarget(self, action: action, for: .touchUpInside)
        return button
    }
    
    func configButtonColor(_ titleValue: String) -> UIColor {
        switch titleValue {
        case "+", "-", "*", "/", "=", "AC" :
            return .orange
        default:
            return UIColor(red: 58/255, green: 58/255, blue: 58/255, alpha: 1.0)
        }
    }
}

Logics.swift

import Foundation

class Logics {
    var currentNumLabel = ""
    
    func tapButton(_ label: String) -> String {
        switch label {
        case "0":
            if currentNumLabel == "0" {
            } else {
                currentNumLabel += "0"
            }
        case "AC":
            currentNumLabel = "0"
            
        case "=":
            if let currentnumlabel = calculate(expression: currentNumLabel) {
                currentNumLabel = String(currentnumlabel)
            } else {
                currentNumLabel = "Error"
            }
        default:
            if currentNumLabel == "0" {
                currentNumLabel = "\(label)"
            } else {
                currentNumLabel += "\(label)"
            }
        }
        
        return currentNumLabel
    }
    
    func calculate(expression: String) -> Int? {
        let expression = NSExpression(format: expression)
        if let result = expression.expressionValue(with: nil, context: nil) as? Int {
            return result
        } else {
            return nil
        }
    }
}

과제 후기

  • 스냅킷을 사용하니 코드가 확실히 줄어드는 것 같다.
  • 스토리보드와 로직면에서 다른점이 있다면, 스토리보드는 버튼에 태그를 붙여서 switch tag 했었는데, 여기선 태그를 붙이지 않고 버튼의 titleLabel을 받아왔다. 이렇게 해 보니까 타이틀을 받아올 수 있는 버튼은 스토리보드에서도 굳이 태그 사용하지 않아도 됐을 것 같다는 생각이 들었다.

실행 화면

profile
정체되지 않는 성장

0개의 댓글