본문 바로가기
iOS

[iOS][Swift UI] 계산기 예제

by teamnova 2023. 4. 20.

안녕하세요. 

 

아래 예제 코드는 계산기를 구현한 예제입니다.

 

buttons 배열에는 계산기 버튼을 포함하고 있습니다.

 

@State 변수를 사용하여 현재 화면에 보여지는 값(display), 첫 번째 피연산자(operand1), 두 번째 피연산자(operand2), 연산자(operation), 그리고 화면 초기화 여부(clearDisplay)를 관리합니다.

handleButtonPress 함수는 사용자가 계산기 버튼을 눌렀을 때 호출되며, 입력한 버튼에 따라 @State 변수를 업데이트하고, 계산 결과를 표시합니다. calculate 함수는 피연산자와 연산자를 사용하여 계산 결과를 반환합니다.

위 예제 코드는 버튼에 따라 배경 색상이 다르게 나타나도록 구현되어 있습니다. 버튼의 배경 색상은 buttonBackground 함수에서 처리되며, switch 문을 사용하여 버튼의 종류에 따라 다른 색상을 반환합니다.

위 예제 코드를 실행하면 iOS에서 제공하는 기본 계산기와 유사한 UI가 나타납니다. 계산 결과는 화면 상단에 표시되며, 사용자가 버튼을 눌러 계산을 수행할 수 있습니다.

 

import SwiftUI

struct ContentView: View {
    // 계산기 버튼 목록
    let buttons = [
        ["7", "8", "9", "X"],
        ["4", "5", "6", "-"],
        ["1", "2", "3", "+"],
        ["C", "0", ".", "="]
    ]
    
    // 현재 화면에 표시될 값
    @State var display = "0"
    // 첫 번째 피연산자
    @State var operand1 = ""
    // 두 번째 피연산자
    @State var operand2 = ""
    // 현재 선택된 연산자
    @State var operation = ""
    // 화면 초기화 여부
    @State var clearDisplay = true
    
    var body: some View {
        VStack(spacing: 12) {
            // 현재 화면에 표시될 값
            Text(display)
                .font(.largeTitle)
                .fontWeight(.bold)
                .lineLimit(1)
                .padding(.trailing, 24)
                .frame(maxWidth: .infinity, alignment: .trailing)
            
            // 계산기 버튼 그리드
            ForEach(buttons, id: \.self) { row in
                HStack(spacing: 12) {
                    ForEach(row, id: \.self) { button in
                        Button(action: {
                            // 버튼 클릭 핸들러
                            handleButtonPress(button)
                        }, label: {
                            Text(button)
                                .font(.title)
                                .fontWeight(.semibold)
                                .frame(maxWidth: .infinity, maxHeight: .infinity)
                                .background(buttonBackground(button))
                                .foregroundColor(.white)
                                .cornerRadius(10)
                        })
                    }
                }
            }
        }
        .padding(12)
    }
    
    // 버튼 배경 색상
    func buttonBackground(_ button: String) -> Color {
        switch button {
        case "X", "-", "+", "=":
            return Color.orange
        case "C":
            return Color.red
        case ".":
            return Color.gray
        default:
            return Color.blue
        }
    }
    
    // 계산기 버튼 클릭 핸들러
    func handleButtonPress(_ button: String) {
        switch button {
        case "C":
            // "C" 버튼: 화면 초기화
            display = "0"
            operand1 = ""
            operand2 = ""
            operation = ""
            clearDisplay = true
        case "X", "-", "+":
            // 연산자 버튼: 피연산자 설정
            operation = button
            operand1 = display
            clearDisplay = true
        case "=":
            // "=" 버튼: 계산 수행
            operand2 = display
            let result = calculate()
            display = result
            operand1 = ""
            operand2 = ""
            operation = ""
            clearDisplay = true
        default:
            // 숫자나 "." 버튼: 현재 값에 추가
            if clearDisplay {
                display = button
                clearDisplay = false
            } else {
                display += button
            }
        }
    }
    
    // 계산 함수
func calculate() -> String {
        // 피연산자와 연산자 추출
    // 올바른 숫자 형식으로 변환하여 계산 수행
    if let num1 = Double(operand1), let num2 = Double(operand2) {
        switch operation {
        case "X":
            return String(num1 * num2)
        case "-":
            return String(num1 - num2)
        case "+":
            return String(num1 + num2)
        default:
            return "0"
        }
    } else {
        // 올바른 숫자 형식이 아닌 경우 "0"으로 처리
        return "0"
    }
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

감사합니다.

'iOS' 카테고리의 다른 글

[iOS][SwiftUI] Todo 만들기  (0) 2023.05.24
[iOS][SwiftUI] 메모장 만들기  (0) 2023.05.07
[iOS][Swift UI] List View 사용하기  (0) 2023.04.04
[iOS][Swift UI] iPages  (0) 2023.03.22
[iOS][Swift UI] 뷰 강제닫기  (0) 2023.03.07