111111111... 같이 표현됨
func configureUI() {
view.backgroundColor = .black // 배경색 검은색 지정
// - MARK: - 라벨 속성 정의
label.text = "0" // 기본 텍스트 지정
label.textColor = .white // 글자색 지정
label.textAlignment = .right // 글자 정렬 기준 지정
label.font = .boldSystemFont(ofSize: 60) // 글자 스타일 지정
view.addSubview(label) // 뷰 위에 라벨 추가
}UILabel 속성중에 아래의 속성을 이용하여 문제점 개선
adjustsFontSizeToFitWidth : 라벨크기에 따라 글자 크기를 조정해주는 속성 minimumScaleFactor : 글자 크기가 줄어드는 최소 비율을 지정하는 속성인계산식이 길어지면 글자 크기가 자동으로 작아지면서 많은 숫자를 표현함

코드
func configureUI() {
view.backgroundColor = .black // 배경색 검은색 지정
// - MARK: - 라벨 속성 정의
label.text = "0" // 기본 텍스트 지정
label.textColor = .white // 글자색 지정
label.textAlignment = .right // 글자 정렬 기준 지정
label.font = .boldSystemFont(ofSize: 60) // 글자 스타일 지정
// 추가한 코드
label.adjustsFontSizeToFitWidth = true // 라벨 크기에 따라 글자 크기 조정
label.minimumScaleFactor = 0.2 // 글자 크기 줄어드는 최소 비율
view.addSubview(label) // 뷰 위에 라벨 추가
}
for문 안에서 if-else문을 사용해서 contains로 orange 배열에 포함된 문자인지 확인하는 로직func makeButton(title: String) -> UIButton {
let button = UIButton() // 버튼 객체 생성
let orange = ["+", "-", "*", "/", "AC", "="]
for i in orange {
if title.contains(i) {
button.backgroundColor = .orange
break
} else {
button.backgroundColor = UIColor(
red: 58/255, green: 58/255, blue: 58/255, alpha: 1.0
)
}
for문이 불필요하다고 판단하여 for문을 제거func makeButton(title: String) -> UIButton {
let button = UIButton() // 버튼 객체 생성
let orange = ["+", "-", "*", "/", "AC", "="]
// 버튼 제목이 오렌지 배열에 포함되면 색을 오렌지 색으로, 아니면 회식으로 설정
if orange.contains(title) {
button.backgroundColor = .orange
} else {
button.backgroundColor = UIColor(
red: 58/255, green: 58/255, blue: 58/255, alpha: 1.0
)
}
0이 오면 그 다음에 숫자만 오게 처리: 실패0 버튼이 계속 눌렸다.13-00000001 @objc
private func buttonTapped(button: UIButton) {
guard let tappedButtonTitle = button.currentTitle else { return }
switch tappedButtonTitle {
case "AC":
label.text = "0"
return
case "=":
// 예외처리: 계산식이 연산자에서 끝났으면 아무동작 하지 않게 처리
if label.text?.last == "/" || label.text?.last == "*" || label.text?.last == "-" || label.text?.last == "+" {
return
} else {
let result = calculateModel.calculate(expression:label.text!)
label.text = String(result!)
}
case "/","*","-","+":
// 예외처리: 마지막 계산식에 연산자가 있으면, 더 이상 연산자를 사용 못하게 처리
if label.text?.last == "/" || label.text?.last == "*" || label.text?.last == "-" || label.text?.last == "+"
{
return
}
// 예외처리: 첫 계산식이 0과 연산자가 될 수 없게 처리
if label.text == "0" || label.text == "/" || label.text == "*" || label.text == "-" || label.text == "+" {
label.text = tappedButtonTitle
} else {
label.text! += tappedButtonTitle
}
default:
// 예외처리: 첫 계산식이 0이 될 수 없게 처리
if label.text == "0" {
label.text! = tappedButtonTitle
} else {
label.text! += tappedButtonTitle
}
}
}
0이 오지 못하게 처리 @objc
private func buttonTapped(button: UIButton) {
/*
최근에 눌린 버튼의 이름을 가저오는 변수
currentTitle 사용하면 최근 사용된 버튼의 title을 가져옴
옵셔널을 언래핑을 위해 guard let 사용
*/
guard let tappedButtonTitle = button.currentTitle else { return }
switch tappedButtonTitle {
case "AC":
label.text = "0"
return
case "=":
// 예외처리: 계산식이 연산자에서 끝났으면 아무동작 하지 않게 처리
if label.text?.last == "/" || label.text?.last == "*" || label.text?.last == "-" || label.text?.last == "+" {
return
} else {
let result = calculateModel.calculate(expression:label.text!)
label.text = String(result!)
}
case "0":
// 예외처리: 연산자 뒤에 "0" 올 수 없게 처리
if label.text?.last == "/" || label.text?.last == "*" || label.text?.last == "-" || label.text?.last == "+"
{
return
} else {
label.text! += tappedButtonTitle
}
case "/","*","-","+":
// 예외처리: 마지막 계산식에 연산자가 있으면, 더 이상 연산자를 사용 못하게 처리
if label.text?.last == "/" || label.text?.last == "*" || label.text?.last == "-" || label.text?.last == "+"
{
return
}
// 예외처리: 첫 계산식이 0과 연산자가 될 수 없게 처리
if label.text == "0" || label.text == "/" || label.text == "*" || label.text == "-" || label.text == "+" {
label.text = tappedButtonTitle
} else {
label.text! += tappedButtonTitle
}
default:
// 예외처리: 첫 계산식이 0이 될 수 없게 처리
if label.text == "0" {
label.text! = tappedButtonTitle
} else {
label.text! += tappedButtonTitle
}
}
}
0이 오면 그 후에 숫자가 입력이 될 때 0이 지워지게 구현하고 싶었으나, 그렇지 못했다.