https://simth999wrld.tistory.com/75
우리말 퀴즈 앱)1.우리말샘 api
https://simth999wrld.tistory.com/74 1차시. OT 간단하게 스터디 일정과 인사후 개인프로젝트 소개를 하였습니다, ^_^/ 간단하게 아이디어를 정리해보았습니다.. 진행과정을 간간히 올려보도록 노력! 프로
simth999wrld.tistory.com
네~! 저번엔 간단히 api를 호출해서 단어의 뜻과 설명등을 가져오는 코드를 작성했습니다,,
현재까지 얼마나 했나,,, 보고아닌 보고를 하기위해 작성하였습니다 ^_^/
아직 구상을 하는 중입니다만,,
아마 만들어가면서 계속 구상을 할것같아요 하하
간단히 4개의 보기를 주고, 문제의 뜻에 대한 단어를 찾는
간단한 뷰를 만들어보았습니다.
나름대로 view와 viewModel을 만들어 보았지만,, view의 코드가 깨끗하지 않은점,,
양해 부탁드립니다 ㅎ
저번 글에서 URLSession을 통해 api통신을 하는 코드중 수정을 조금 하였습니다.
func searchWord(_ searchWord: String, completion: @escaping (WordData?) -> Void) {
let urlString = "https://opendict.korean.go.kr/api/search?certkey_no=6282&key=\(myApiKey)&target_type=search&req_type=json&part=word&q=\(searchWord)&sort=dict&start=1&num=10"
if let url = URL(string: urlString) {
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { data, response, error in
if error == nil {
if let safeData = data {
do {
let decodedData = try JSONDecoder().decode(WordData.self, from: safeData)
DispatchQueue.main.async {
self.wordData = decodedData
completion(decodedData) // 완료 핸들러 호출
}
} catch {
print(error)
completion(nil)
}
}
} else {
print(error)
completion(nil)
}
}
task.resume()
}
}
차이가 조금 보이시나요? ㅎㅎ
저도 아직 감은 잡히지 않았지많,, 완료 핸들러를 추가하였습니다.
흠 추가한 이유는! 4개의 보기의 단어를 검색해서 가져온 데이터를 저장해 주기위해서 입니다,,
추가한 코드를 설명해 드리겠습니다.
QuizViewModel.swift
위에서 보여진 앱은 QuizView.swift 입니다.
이 뷰에 보여지는 데이터 추가를 위해 QuizViewModel을 추가하였는데요!
프로퍼티
let hardKoreanWords = HardKoreanWords()
let wordNetwork = WordNetwork()
var choiceWords = [String]()
var correctWord: String = ""
var correctWordDefinition: String = ""
var wordDataDictionary = [String: WordData]()
@Published var isLoading = false
어려운 단어를 하드코딩해서 넣어둔 hardKoreanWords
우리샘 api를 사용하여 네트워크 통신을 하는 wordNetwork
정답인 단어를 넣어두는 choiceWord
정답인 단어의 뜻을 넣어두는 correctWordDefinition
보기의 단어들을 넣어두는 딕셔너리인wordDataDictionary
등이 있습니다!
(isLoading은 프로그래스를 추가해서 검색하는 시간동안 보여주려 하는 함수이지만,, 아직 작동은 안하는..)
보기생성 generateChoices()
func generateChoices() {
choiceWord.append(correctWord)
while choiceWord.count < 4 {
let randomWord = hardKoreanWords.hardWords.randomElement()!
if !choiceWord.contains(randomWord) {
choiceWord.append(randomWord)
}
}
//보기 섞기
choiceWord.shuffle()
//단어 검색 및 데이터 저장
for word in choiceWord {
wordNetwork.searchWord(word) { wordData in
self.handleWordData(word: word, wordData: wordData)
}
}
print(choiceWord)
}
보기를 생성하는 메소드 입니다.
for word in choiceWord를 위해서 앞서 말한 (URLSession을 통해 api통신을 하는 코드중 수정)부분 입니다.
완료 핸들러를 넘겨 받아서 handleWordData를 통해
wordDataDictionary에 보기 단어를 저장합니다.
단어 데이터 처리 handleWordData()
func handleWordData(word: String, wordData: WordData?) {
if let wordData = wordData {
wordDataDictionary[word] = wordData
// 정답 단어의 설명을 가져오기
if word == correctWord {
fetchCorrectWordDefinition()
}
} else {
print("\(word) 단어 데이터를 가져오지 못함 ")
}
}
URLSession을 통해 api통신을 하는 코드를 완료하게 된다면
handleWordData를 호출하여 wordDataDictionary에 저장을 합니다.
정답 단어의 설명 가져오기fetchCorrectWordDefinition()
func fetchCorrectWordDefinition() {
isLoading = true
// choiceWords 배열에서 랜덤하게 정답 선택
correctWord = choiceWord.randomElement() ?? ""
guard let wordData = wordDataDictionary[correctWord] else {
correctWordDefinition = "설명을 가져올 수 없습니다."
isLoading = false
return
}
if let firstSense = wordData.channel.item.first?.sense.first {
correctWordDefinition = firstSense.definition
print(correctWordDefinition)
} else {
correctWordDefinition = "설명을 찾을 수 없습니다."
}
isLoading = false
}
4개의 단어중 무작위로 정답을 선택합니다.
guard let은 프로그래스뷰를 설정하기 위해 추가를 하였지만,,,ㅎ 아직 성공은 못했습니다.
데이터가 있는 경우 첫번째의 뜻을 correctWordDefinition에 추가합니다. (정렬이 우리말샘순 이여서 첫번째가 가장 적합하였습니다.)
데이터가 없을 경우는 설명을 찾을 수 없습니다 의 내용을 저장합니다.
정답 확인 메서드 checkAnswer()
func checkAnswer(selectedWord: String) -> Bool {
return selectedWord == correctWord
}
선택된 단어가 정답과 일치하는지 확인하는 메서드 입니다.
init()
init() {
correctWord = hardKoreanWords.hardWords.randomElement() ?? ""
generateChoices()
}
클래스의 인스턴스가 생성될때 호출되는 init입니다.
generateChoices()메서드를 호출하여 선택지를 생성하며 단어의 데이터를 검색하고,저장할 수 있도록 합니다.
QuizView.swift
VStack{
Text("QuizView")
.padding(.top, 50)
Spacer()
if quizViewModel.isLoading {
ProgressView("Loading...")
} else {
Image(systemName: "square.and.arrow.up")
Text(quizViewModel.correctWordDefinition)
}
Spacer()
VStack(){
HStack {
ForEach(quizViewModel.choiceWord.prefix(2), id: \.self) { word in
Button(action: {
// 선택된 단어에 대한 동작을 추가하세요
isAnswerCorrect = quizViewModel.checkAnswer(selectedWord: word)
print("선택된 단어: \(word), 정답?: \(isAnswerCorrect)")
}) {
Text(word)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
.padding()
}
}
HStack {
ForEach(quizViewModel.choiceWord.dropFirst(2), id: \.self) { word in
Button(action: {
// 선택된 단어에 대한 동작을 추가하세요
isAnswerCorrect = quizViewModel.checkAnswer(selectedWord: word)
print("선택된 단어: \(word), 정답?: \(isAnswerCorrect)")
}) {
Text(word)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
.padding()
}
}
}
Text(isAnswerCorrect ? "정답입니다!" : "오답입니다.")
Spacer()
}//VStack
quizview에서 간단하게 보기 단어를 4개 보여주고 정답유무를 확인하는 텍스트를 추가하였습니다 하하..
아직
Image(systemName: "square.and.arrow.up")
를 완성하지 않았는데요!
이부분은 네이버 검색API를 활요해서 정답 단어의 관련 이미지를 보여줄 예정입니다 ㅎㅎ..
이 정도 구현하는것도 어렵네요,, 하하,,,
저의 수준을 잘 파악 할수 있는 시간이 되었습니다 ㅎㅎ
조금은 SwiftUI와 친숙해진 시간이 된것 같네요??!!
다음은 네이버 검색 API를 활용한 글을 가져오겠습니다...
이상 보고 끝!(화이팅,,!👏)
'스터디 > 우리말 단어 퀴즈(SwiftUI)' 카테고리의 다른 글
우리말 퀴즈 앱)5. urlSession을 async await으로 바꾸기.. (0) | 2024.05.19 |
---|---|
우리말 퀴즈 앱)4. 위젯, Scheme 사용한 API KEY 숨기기 (0) | 2024.03.25 |
우리말 퀴즈 앱)3.Alamofier, 네이버 검색 API 사용 (0) | 2024.02.23 |
우리말 퀴즈 앱)1.우리말샘 api (0) | 2024.01.25 |
1차시. OT (0) | 2024.01.24 |