Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- SWIFT
- NavigationSearchBar
- 자료구조
- Value Type Reference Type
- 양궁대회
- UIKit
- @escaping
- Reference Cycle
- UserDefaults
- wil
- CoreData
- coremotion
- 면접을 위한 CS전공 지식 노트
- tableview section별 다른 cell적용
- CarouselCollectionview
- Input Output
- 프로그래머스
- til
- Carousel CollectionView
- TableView Section
- 테이블뷰 나누기
- 면접을 위한 CS 전공 지식 노트 Tree
- ReferceCycle
- 강한 참조 순환
- retain cycle
- Array vs Linked List
- TableView
- class struct
- firebase
- 롤케이크 자르기
Archives
- Today
- Total
개발하는 동글 :]
[TIL],[UIkit] 계산기 사칙연산 로직_수정 본문
음수 계산이 되지 않았던 기존의 방식은 문자열을 배열로 만들 때 숫자인지 아닌지를 기준으로 분리를 했었다. 하지만 그렇게 할 시 음수가 배열에 저장되면 부호를 따로 빼서 저장을 하는 문제가 발생하였었기에 부호를 추가할 때 양 옆으로 공백의 문자열을 추가한 뒤 배열로 만들 때 공백을 기준으로 배열을 만들어보니 문제가 해결 되었다.
//
// 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
}
}