前提・実現したいこと
swiftの初心者です。
今Xcodeで3択のクイズアプリを作成しています。
クイズ問題と3択の選択肢が出題され、回答した後に次の問題に移ります。
元々のコードではCSVデータを順に読み込むようになっており、","で分割され、改行ごとに1行分のデータになっていて、
クイズ問題,選択肢1,選択肢2,選択肢3,正解の選択肢番号
の順に記載されています。csvデータ内にデータは4つ入っています。今、CSVデータに記述されている問題をシャッフルして3問出題するにはどのようなコードを書けばいいのでしょうか。
ご教授お願いします。
発生している問題・エラーメッセージ
シャッフルをするのにrandomToolを使ったのですが、試しに実行をしても全然シャッフルされていなく、csvデータの順番に出題されています。
該当のソースコード
swift
1import Foundation 2 3class QuestionData { 4 var question: String 5 var answer1: String 6 var answer2: String 7 var answer3: String 8 var correctAnswerNumber: Int 9 var userChoiceAnswerNumber: Int? 10 11 // 問題文の番号 12 var questionNo: Int = 0 13 14 // クラスが生成された時の処理 15 init(questionSourceDataArray: [String]) { 16 question = questionSourceDataArray[0] 17 answer1 = questionSourceDataArray[1] 18 answer2 = questionSourceDataArray[2] 19 answer3 = questionSourceDataArray[3] 20 correctAnswerNumber = Int(questionSourceDataArray[4])! 21 } 22 23 // ユーザが選択した答えが正解かどうか判定する 24 func isCorrect() -> Bool { 25 // 答えが一致しているかどうか判定する 26 if correctAnswerNumber == userChoiceAnswerNumber { 27 // 正解 28 return true 29 } 30 // 不正解 31 return false 32 } 33} 34 35// クイズデータ全般の管理と生成を管理するクラス 36class QuestionDataManager { 37 38 // シングルトンのオブジェクトを生成 39 static let sharedInstance = QuestionDataManager() 40 41 // 問題を格納するための配列 42 var questionDataArray = [QuestionData]() 43 44 // 現在の問題のインデックス 45 var nowQuestionIndex = 0 46 47 // 初期化処理 48 private init() { 49 // シングルトンであることを保証するためにprivateで宣言しておく 50 } 51 //問題数のカウント 52 var counter = 0 53 54 // 問題文の読み込み処理 55 func loadQuestion() { 56 // 格納済みの問題文であればいったん削除しておく 57 questionDataArray.removeAll() 58 // 現在の問題のインデックスを初期化 59 nowQuestionIndex = 0 60 61 // csvファイルパスを取得 62 guard let csvFilePath = Bundle.main.path(forResource: "question", ofType: "csv") else { 63 // csvファイルなし 64 print("csvファイルが存在しません") 65 return 66 } 67 68 do { 69 let csvStringData = try String(contentsOfFile: csvFilePath, encoding: String.Encoding.utf8) 70 // csvデータを1行ずつ読み込む 71 csvStringData.enumerateLines ( invoking: {(line, stop) -> () in 72 // カンマ区切りで分割 73 let questionSourceDataArray = line.components(separatedBy: ",") 74 // 問題データを格納するオブジェクトを作成 75 let questionData = QuestionData(questionSourceDataArray: questionSourceDataArray) 76 // 問題を追加 77 self.questionDataArray.append(questionData) 78 // 問題番号を設定 79 questionData.questionNo = self.questionDataArray.count 80 }) 81 } catch let error { 82 print("csvファイル読み込みエラーが発生しました(error)") 83 return 84 } 85 } 86 //配列に同じ数値を入れて初期化 87 var questionArrayCut = [Int](repeating: 0 , count: 3) 88 func randomTool() { 89 //0~3の中から重複しない4個の乱数を生成し、配列に入れてもどす 90 let questionArray: [Int] = [0, 1, 2, 3] 91 var questionArray_Shuffled = questionArray.shuffled() 92 93 for n in 0...2 { 94 questionArrayCut[n] = questionArray_Shuffled[n+5] 95 print(questionArrayCut[n]) 96 } 97 } 98 // 次の問題を取り出す 99 func nextQuestion() -> QuestionData? { 100 if counter < 3 { 101 //ここでランダム 102 //counterが0~2の範囲で1ずつ増えるため、配列の値を取得 103 let qArray: [Int] = questionArrayCut 104 nowQuestionIndex = qArray[counter] 105 print(nowQuestionIndex) 106 let nextQuestion = questionDataArray[counter] 107 counter += 1 108 return nextQuestion 109 }else{ 110 counter = 0 111 } 112 return nil 113 } 114 115} 116 117
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/29 09:05