[iOS / Swift] Storyboard 간단한 계산기 만들기(3) 코드개선

2025. 1. 6. 17:51

지난 글에서 말했듯이 이번엔 값이 입력되지 않았을 때 경고창을 띄우는 기능을 추가해 볼것임.

func showAlert(message: String) {
        let alert = UIAlertController(title: "알림", message: message, preferredStyle: .alert)
        
        let okAction = UIAlertAction(title: "확인", style: .default)
        alert.addAction(okAction)
        
        present(alert, animated: true)
    }

먼저 showAlert라는 함수를 생성해 알림을 띄우는 함수를 만드는 것이 첫번쨰임. 이걸 넣어주면 되는데 적용해 보겠음. 

 

@IBAction func calculateButton(_ sender: Any) {
        guard let text = firstOperandField.text, let a = Int(text) else {
            let alert = UIAlertController(title: "알림", message: "값을 입력해 주세요.", preferredStyle: .alert)
            
            let okAction = UIAlertAction(title: "확인", style: .default)
            alert.addAction(okAction)
            
            present(alert, animated: true) // true면 페이드 애니메이션이 추가, false면 애니메이션이 없음
            
            return
        }
        
        guard let text = secondOperandField.text, let b = Int(text) else {
            
            let alert = UIAlertController(title: "알림", message: "값을 입력해 주세요.", preferredStyle: .alert)
            
            let okAction = UIAlertAction(title: "확인", style: .default)
            alert.addAction(okAction)
            
            present(alert, animated: true)
            
            return
        }
        
        guard let op = operatorButton.title(for: .normal) else {
            
            let alert = UIAlertController(title: "알림", message: "연산자를 선택해 주세요.", preferredStyle: .alert)
            
            let okAction = UIAlertAction(title: "확인", style: .default)
            alert.addAction(okAction)
            
            present(alert, animated: true)
            
            return
        }

이런 식으로 각각 연산자, 숫자 위에칸, 아래칸이 비었을 때 경고창이 뜨게 했음

근데 매번 이런식으로 경고창이 뜨는 코드를 넣는건 너무 가독성이 떨어지고 코드가 길어짐.

 

이걸 함수로 묶어서 한번에 정리해보겠음.

func showAlert(message: String) {
        let alert = UIAlertController(title: "알림", message: message, preferredStyle: .alert)
        
        let okAction = UIAlertAction(title: "확인", style: .default)
        alert.addAction(okAction)
        
        present(alert, animated: true) // true면 페이드 애니메이션이 추가, false면 애니메이션이 없음
    }

이렇게 `Alert`창을 띄우는 메서드를 만들어주고 이걸 기존에 `Alert`창을 나오게하는 부분에서 `showAlert`를 불러와주기만 하면 됨.

 

@IBAction func calculateButton(_ sender: Any) {
        guard let text = firstOperandField.text, let a = Int(text) else {
            showAlert(message: "값을 입력해 주세요")
            return
        }

이런 방식으로 `message`에 내가 띄울 경고 메세지만 정해주면 됨

 

전체코드로 정리해보면

//
//  ViewController.swift
//  Calculator
//
//  Created by 김광현 on 12/4/24.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var firstOperandField: UITextField!
    
    @IBOutlet weak var secondOperandField: UITextField!
    
    func showAlert(message: String) {
        let alert = UIAlertController(title: "알림", message: message, preferredStyle: .alert)
        
        let okAction = UIAlertAction(title: "확인", style: .default)
        alert.addAction(okAction)
        
        present(alert, animated: true) // true면 페이드 애니메이션이 추가, false면 애니메이션이 없음
    }
    
    // func 함수 선언 - 함수명 - _ Argument Label 생략, Parameter 이름 : sender, 타입 : Any
    // 단, Class안에 있으므로 Func보단 Method라고 부르는게 맞음. 나중에 정리하겠음
    @IBAction func selectOperator(_ sender: Any) {
        let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
        
        // 액션을 만드는 코드
        let plusAction = UIAlertAction(title: "+(더하기)", style: .default) { _ in
            self.operatorButton.setTitle("+", for: .normal)
        }
        actionSheet.addAction(plusAction) // 액션시트에 추가
        
        let minusAction = UIAlertAction(title: "-(빼기)", style: .default) { _ in
            self.operatorButton.setTitle("-", for: .normal)
        }
        actionSheet.addAction(minusAction)
        
        let multiplyAction = UIAlertAction(title: "*(곱하기)", style: .default) { _ in
            self.operatorButton.setTitle("*", for: .normal)
        }
        actionSheet.addAction(multiplyAction)
        
        let divideAction = UIAlertAction(title: "/(나누기)", style: .default) { _ in
            self.operatorButton.setTitle("/", for: .normal)
        }
        actionSheet.addAction(divideAction)
        
        present(actionSheet, animated: true) // 함수를 호출
        
    }
    
    @IBOutlet weak var operatorButton: UIButton!
    
    
    @IBOutlet weak var resultLabel: UILabel!
    
    
    @IBAction func calculateButton(_ sender: Any) {
        guard let text = firstOperandField.text, let a = Int(text) else {
            showAlert(message: "값을 입력해 주세요")
            return
        }
        
        guard let text = secondOperandField.text, let b = Int(text) else {
            showAlert(message: "값을 입력해 주세요")
            return
        }
        
        guard let op = operatorButton.title(for: .normal) else {
            showAlert(message: "연산자를 선택해 주세요")
            return
        }
        
        var result: Int? = nil
        
        switch op {
        case "+" :
            result = a + b
        case "-" :
            result = a - b
        case "*" :
            result = a * b
        case "/" :
            result = a / b
        default :
            showAlert(message: "연산자를 선택해 주세요")
        }
        
        guard let result else { return }
        
        resultLabel.text = "\(result)"
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

코드를 줄이면서 Function 즉, func을 사용해서 호출하는 방식으로 코드를 줄여봤음.

함수의 기본 개념

: 함수(Function)는 프로그래밍에서 특정 작업을 수행하도록 설계된 코드 블록임. 함수는 필요할 때 여러 번 호출해서 실행할 수 있음. 

  1. 입력(Input): 함수가 작업을 수행하기 위해 필요로 하는 데이터(매개변수 또는 인자).
  2. 처리(Processing): 함수가 수행하는 작업 또는 연산.
  3. 출력(Output): 함수가 반환하는 결과값.

이정도로만 알고 문법 정리하는 곳에서 좀더 자세히 다뤄보겠음

BELATED ARTICLES

more