Q&A
前提・実現したいこと
- クイズアプリを iOS で作成しております。
- RealmSwift を利用した、DB操作を行うことで、正解、不正解した問題を記録しようとしております。
- 問題は、CSVからQuestionとして保存して、QuizViewControllerで読み書きしようと考えております。
- 正解・不正解は、Bool型にしているのですが、RealmSwiftを利用して、Boolを更新ができずにこまっております。
- RealmSwiftを介した、Boolの値の更新ができるようにしたいです。
発生している問題・エラーメッセージ
- RealmSwiftを介した、Boolの値の更新ができない。
- updateCorrectQuestion(), updateIncorrectQuestion() の realm.write() 前後に Print を仕込んでみたのですが、正解しても、nil になっていたり、Optional(false)になってしまいます。
該当のソースコード
swift
1import UIKit 2import GoogleMobileAds 3import RealmSwift 4 5class QuizViewController: UIViewController { 6 7 var bannerView: GADBannerView! 8 var quizArray: [String] = [] 9 var answeredQuestionCount = 0 10 var correctCount = 0 11 var selectedGenre = 0 12 13 let csvArray = loadCsv(fileName: "question") 14 15 let realm = try! Realm() 16 lazy var targetQuestions = realm.objects(Question.self) 17 .filter("genreNumber = \(selectedGenre)") 18 .filter("wasCorrect != true") 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 23 for csvStr in csvArray { 24 if (csvStr == "") { 25 break 26 } 27 Question().saveCsvValue(csvStr: csvStr) 28 } 29 setQuestion() 30 } 31 32 // ボタンを押したときに呼ばれる 33 @IBAction func btnAction(sender: UIButton){ 34 if sender.tag == targetQuestions[answeredQuestionCount].answer { 35 correctCount += 1 36 judgeImageView.image = UIImage(named: "correct") 37 updateCorrectQuestion() 38 }else{ 39 judgeImageView.image = UIImage(named: "incorrect") 40 updateIncorrectQuestion() 41 } 42 judgeImageView.isHidden = false 43 answerButton1.isEnabled = false 44 answerButton2.isEnabled = false 45 answerButton3.isEnabled = false 46 answerButton4.isEnabled = false 47 48 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5){ 49 self.judgeImageView.isHidden = true 50 self.answerButton1.isEnabled = true 51 self.answerButton2.isEnabled = true 52 self.answerButton3.isEnabled = true 53 self.answerButton4.isEnabled = true 54 55 self.setNextQuestion() 56 } 57 } 58 59 /** 60 正解した問題を正解した問題として記録する 61 */ 62 private func updateCorrectQuestion(){ 63 print("XXXXX - Correct : \(targetQuestions[answeredQuestionCount].wasCorrect)") 64 // todo - Boolを保存できるように修正 65 try! realm.write{ 66 targetQuestions[answeredQuestionCount].wasCorrect = true 67 } 68 print("XXXXX - Correct : \(targetQuestions[answeredQuestionCount].wasCorrect)") 69 } 70 71 /** 72 不正解だった問題を不正解の問題として記録する 73 */ 74 private func updateIncorrectQuestion(){ 75 print("XXXXX - InCorrect : \(targetQuestions[answeredQuestionCount].wasCorrect)") 76 // todo - Boolを保存できるように修正 77 try! realm.write{ 78 targetQuestions[answeredQuestionCount].wasCorrect = false 79 } 80 print("XXXXX - InCorrect : \(targetQuestions[answeredQuestionCount].wasCorrect)") 81 } 82 83 private func setQuestion(){ 84 quizNumberLabel.text = "第\(answeredQuestionCount + 1)問" 85 quizTextView.text = targetQuestions[answeredQuestionCount].statement 86 answerButton1.setTitle(targetQuestions[answeredQuestionCount].choise1, for: .normal) 87 answerButton2.setTitle(targetQuestions[answeredQuestionCount].choise2, for: .normal) 88 answerButton3.setTitle(targetQuestions[answeredQuestionCount].choise3, for: .normal) 89 answerButton4.setTitle(targetQuestions[answeredQuestionCount].choise4, for: .normal) 90 } 91 92 private func setNextQuestion(){ 93 answeredQuestionCount += 1 94 if answeredQuestionCount < 10 { 95 setQuestion() 96 } else { 97 performSegue(withIdentifier: "toScoreVC", sender: nil) 98 } 99 } 100}
swift
1import RealmSwift 2 3class Question: Object { 4 @Persisted var questionId: String = "" 5 @Persisted var genreNumber: Int 6 @Persisted var statement: String = "" 7 @Persisted var answer: Int 8 @Persisted var choise1: String 9 @Persisted var choise2: String 10 @Persisted var choise3: String 11 @Persisted var choise4: String 12 @Persisted var wasCorrect: Bool? 13 14 func saveCsvValue(csvStr:String) { 15 // CSVなのでカンマでセパレート 16 let splitStr = csvStr.components(separatedBy: ",") 17 self.questionId = splitStr[0] 18 self.genreNumber = Int(splitStr[1]) ?? 0 19 self.statement = splitStr[2] 20 self.answer = Int(splitStr[3]) ?? 0 21 self.choise1 = splitStr[4] 22 self.choise2 = splitStr[5] 23 self.choise3 = splitStr[6] 24 self.choise4 = splitStr[7] 25 self.wasCorrect = Bool(splitStr[8]) 26 // 保存 27 let realm = try! Realm() 28 do { 29 try realm.write { 30 realm.add(self) 31 } 32 } catch { 33 } 34 } 35} 36
自分で調べたことや試したこと
- Printによる、デバッグ
使っているツールのバージョンなど補足情報
- OS : macOS Monterey
- version : 12.3
- XCode : 13.4.1
- Realm :
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/11/30 16:39