본문 바로가기
Swift/기초

21. 스위프트 기초 문법[계산기(5) - 코드 개선]

by UDDT 2025. 1. 14.

Swift/기초 카테고리에 업로드한 모든 내용은 KxCoding 기초 강의를 토대로 작성하였습니다.

 

코드 개선하기

  1. 코드 바꾸기

let a = Int(firstOperandField.text!)!
// 하단의 코드로 변경(!로 추출을 2번하고 있기 때문에 바인딩도 2번 해야함)
if let text = firstOperandField.text, let a = Int(text) {

}

 

  2. 나머지 코드도 변경

let b = Int(secondOperandField.text!)!
// 하단의 코드로 변경(!로 추출을 2번하고 있기 때문에 바인딩도 2번 해야함)
if let text = secondOperandFiled.text, let b = Int(text) {

}

let op = operatorButton.title(for: .normal)!
// 하단의 코드로 변경
if let op = operatorButton.title(for: .normal)!

  * 상수를 선언할 때 같은 이름을 가진 상수를 선언할 수 없다고 했었는데, 여기서는 text를 2번 써도 문제가 발생하지 않음.
     (if문 안에서 바인딩한 상수 이름은 if문 안에서만 유효함)

  * 하단의 컴파일 에러가 잔뜩 생긴 이유는 'a', 'b,' 'op' 모두 if문 안에서만 작동하기 때문에 스코프가 일치하지 않음.

 

  3. 컴파일 에러 해결을 위해 코드 위치 조정(if문 중첩)

 

  4. 문제는 해결되었지만 바인딩이 성공할 때마다 중첩 단계가 깊어짐(Pyramid of Doom)

if let text = firstOperandFiled.text, let a = Int(text) {
   if let text = secondOperandFiled.text, let b = Int(text) {
     if let op = operatorButton.title(for: .normal) {
        if op == "+" {
                let result = a + b
                resultLabel.text = "\(result)"
        } else if op == "-" {
                let result = a - b
                resultLabel.text = "\(result)"
        } else if op == "*" {
                let result = a * b
                resultLabel.text = "\(result)"
        } else if op == "/" {
                let result = a / b
                resultLabel.text = "\(result)"
        } else {
             print("연산자 선택")
     }
   }
}

 

  5. 4번 문제를 해결하기 위해 if문을 중첩                   * 가독성이 떨어짐

if let text = firstOperandFiled.text, let a = Int(text), let text =
   secondOperandFiled.text, let b = Int(text), let op = operatorButton.title(for: .normal) {

	if op == "+" {
		let result = a + b
		resultLabel.text = "\(result)"
			} else if op == "-" {
				let result = a - b
				resultLabel.text = "\(result)"
			} else if op == "*" {
				let result = a * b
				resultLabel.text = "\(result)"
			} else if op == "/" {
				let result = a / b
				resultLabel.text = "\(result)"
			} else {
				print("연산자 선택")
			}
	}
}

 

  6. if문을 Guard문으로 코드 변경             * 가독성이 좋아짐(그러나 항상 그런 것은 아님)

if let text = firstOperandFiled.text, let a = Int(text) {
   if let text = secondOperandFiled.text, let b = Int(text) {
     if let op = operatorButton.title(for: .normal) {
        if op == "+" {
                let result = a + b
                resultLabel.text = "\(result)"
        } else if op == "-" {
                let result = a - b
                resultLabel.text = "\(result)"
        } else if op == "*" {
                let result = a * b
                resultLabel.text = "\(result)"
        } else if op == "/" {
                let result = a / b
                resultLabel.text = "\(result)"
        } else {
             print("연산자 선택")
     }
   }
}


// Guard문으로 변경
guard let text = firstOperandFiled.text, let a = Int(text) else {
      return
}
guard let text = secondOperandFiled.text, let b = Int(text) else {
      return
}
guard let op = operatorButton.title(for: .normal) else {
      return
}
if op == "+" {
    let result = a + b
    resultLabel.text = "\(result)"
} else if op == "-" {
    let result = a - b
    resultLabel.text = "\(result)"
} else if op == "*" {
    let result = a * b
    resultLabel.text = "\(result)"
} else if op == "/" {
    let result = a / b
    resultLabel.text = "\(result)"
} else {
    print("연산자 선택")
}

 

  7.  나머지 if문도 switch를 사용하여 코드 정리

if op == "+" {
	let result = a + b
	resultLabel.text = "\(result)"
} else if op == "-" {
	let result = a - b
	resultLabel.text = "\(result)"
} else if op == "*" {
	let result = a * b
	resultLabel.text = "\(result)"
} else if op == "/" {
	let result = a / b
	resultLabel.text = "\(result)"
} else {
	print("연산자 선택")
}

// switch로 코드 정리
var result: Int? = nil

swtich op {
case "+" :
	result = a + b
case "-" :
	result = a - b
case "*" :
	result = a * b
case "/" :
	result = a / b
default:
	break
}
guard let result else { return }

resultLabel.text = "\(result)"

최근댓글

최근글

skin by © 2024 ttuttak