본문 바로가기
IT/swift

100 days of SwiftUI - Day35

by 가능성1g 2024. 12. 1.
반응형

복습의 시간!

 

for, forEach, ForEach 는 다르다!

for 반복문

forEach 배열의 내부함수 고차함수, 클로저

ForEach 뷰를 반복하는 modifier

 

리소스에 대한 이야기

모든 리소스파일(코딩이외 파일 프로젝트중 start.txt 단어리스트 같은거)는 빌드 타임에는 bundle로 묶여서 resources 폴더에 

한곳에 존재하게 된다. 그래서 프로젝트 내에 리소스파일은 동일한 이름을 쓰게되면, 오류가 발생한다!

 

그리고 오늘의 과제!

구구단을 입력한 단, 횟수만큼 문제를 내는 앱 만들기! 

 

//
//  ContentView.swift
//  edutainment
//
//  Created by HanTJ on 12/1/24.
//

import SwiftUI

struct Question {
    var Q:String
    var A:Int
}

struct ContentView: View {
    @State private var multipleTable = 2
    @State private var selectedQuestionCount = 0
    let questionCount = ["5", "10", "20"]
    
    @State private var Questions:[Question] = []
    var questionIndex = 0
    
    @State private var state = 0
    
    @State private var currentQuestion:Question = Question(Q: "", A: 0)
    @State private var inputAnswer = ""
    
    var body: some View {
        NavigationStack{
            if state == 0 {
                Form {
                    Section {
                        Stepper("구구단 \(multipleTable)단", value: $multipleTable, in : 2...9)
                    }
                    
                    Section {
                        Picker("질문 갯수", selection: $selectedQuestionCount) {
                            ForEach(0..<questionCount.count, id: \.self) {
                                Text(self.questionCount[$0])
                            }
                        }
                    }
                    
                    Section {
                        Button("게임시작") {
                            startGame()
                        }
                    }
                }
            }
            else if state == 1 {
                VStack {
                    Text(currentQuestion.Q)
                    TextField("답을 입력하세요", text: $inputAnswer)
                    Button("제출") {
                        checkAnswer()
                    }
                }
            }
        }
    }
    
    func startGame() {
        //선택한 갯수만큼 질문 생성
        Questions.removeAll()
        for _ in 1...Int(questionCount[selectedQuestionCount])! {
            let number = Int.random(in: 1...9)
            Questions.append(Question(Q: "\(multipleTable) * \(number) = ?", A: multipleTable * number))
        }
        currentQuestion = Questions.popLast() ?? Question(Q: "", A: 0)
        state = 1
    }
    
    func checkAnswer() {
        //답체크 후, 알림창 출력
        if inputAnswer == String(currentQuestion.A) {
            print("맞았다!")
        } else {
            print("틀렸다!")
        }
        
        currentQuestion = Questions.popLast() ?? Question(Q: "", A: 0)
        if currentQuestion.Q == "" {
            //게임종료
            startGame()
            state = 0
        }
    }
}

#Preview {
    ContentView()
}

시간 관계상 알람창 띄우기, 애니메이션 넣기, 답입력한거 초기화 하기 점수 표기하기 등은 생략했다 -ㅠ-;

반응형