스토리보드를 적극 사용해 해결한 과제는 여기에서 확인
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)
}
}
}
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을 받아왔다. 이렇게 해 보니까 타이틀을 받아올 수 있는 버튼은 스토리보드에서도 굳이 태그 사용하지 않아도 됐을 것 같다는 생각이 들었다.