質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

420閲覧

クイズアプリの問題をシャッフル出題するには

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/02/05 01:11

前提・実現したいこと

初心者です。
Xcodeで5択のクイズアプリを作成しています。
クイズ問題と5択の選択肢が出題され、
正解の場合は正解音と共に次の問題へ移り、
不正解の場合は不正解音と共に正解が表示された後に、次の問題に移ります。
元々のコードではCSVデータを順に読み込むようになっているため、シャッフルはされません。
CSVデータには","で分割され、改行ごとに1行分のデータになっていて、

クイズ番号,出題年度,出題分野,クイズ問題,選択肢1,選択肢2,選択肢3,選択肢4,選択肢5,正解の選択肢番号

の順に記載されています。CSVデータに記述されている問題をシャッフルして出題するにはどのようなコードを書けばいいのでしょうか。
ご教授お願いします。
もしくはヒントとなるサイトだけでも教えていただければ幸いです。

発生している問題

他の質問サイトを参考にコードを記入したところ永遠に同じ問題が出続けるようになってしまいました。

該当のソースコード

Swift

1import Foundation 2//一つの問題に情報を格納するデータクラス 3class QuestionData { 4 5 //問題文 6 var question: String 7 //選択肢1〜5 8 var answer1: String 9 var answer2: String 10 var answer3: String 11 var answer4: String 12 var answer5: String 13 14 //正解の番号 15 var correctAnswerNumber: Int 16 17 //ユーザーが選択した選択肢の番号 18 var userChoiceAnswerNumber: Int? 19 //問題文の番号 20 var questionNo: Int 21 //何年の問題か 22 var questionYear: Int 23 //どの分野か 24 var questionField: String 25 26 //クラスが生成された時の処理 27 init(questionSourceDataArray: [String]) { 28 questionNo = Int(questionSourceDataArray[0])! 29 questionYear = Int(questionSourceDataArray[1])! 30 questionField = questionSourceDataArray[2] 31 question = questionSourceDataArray[3] 32 answer1 = questionSourceDataArray[4] 33 answer2 = questionSourceDataArray[5] 34 answer3 = questionSourceDataArray[6] 35 answer4 = questionSourceDataArray[7] 36 answer5 = questionSourceDataArray[8] 37 correctAnswerNumber = Int(questionSourceDataArray[9])! 38 } 39 40 //ユーザーが選択した答えが正解かどうか判定する 41 func isCorrect() -> Bool { 42 //答えが一致しているかどうか判定する 43 if correctAnswerNumber == userChoiceAnswerNumber { 44 //正解 45 return true 46 } 47 //不正解 48 return false 49 } 50} 51 52//クイズデータ全般の管理と成績を管理するクラス 53class QuestionDataManager { 54 //シングルトンのオブジェクトを生成 55 static let sharedInstance = QuestionDataManager() 56 //問題を格納するための配列 57 var questionIGAKUDataArray = [QuestionData]() 58 //現在のデータのインデックス 59 var nowQuestionIndex: Int = 0 60 //初期化処理 61 private init() { 62 //シングルトンであることを保証するためにprivateで宣言しておく 63 } 64 //問題文の読み込み処理 65 func loadQuestion() { 66 //格納済みの問題文があれば一旦削除しておく 67 questionDataArray.removeAll() 68 //現在の問題のインデックスを初期化 69 nowQuestionIndex = 0 70 //csvファイルパスを取得 71 guard let csvFilePath = Bundle.main.path(forResource: "question", ofType: "csv") else { 72 //csvファイルなし 73 print("csvファイルが存在しません") 74 return 75 } 76 //csvファイル読み込み 77 do { 78 let csvStringData = try String(contentsOfFile: csvFilePath, encoding: String.Encoding.utf8) 79 //csvデータを1行ずつ読み込みます 80 csvStringData.enumerateLines(invoking: { (line, stop) in 81 //カンマ区切りで分割 82 let questionSourceDataArray = line.components(separatedBy: ",") 83 84 //問題データを格納するオブジェクトを作成 85 let questionData = QuestionData(questionSourceDataArray: questionSourceDataArray) 86 //問題を追加 87 self.questionDataArray.append(questionData) 88 89 }) 90 } catch let error { 91 print("csvファイル読み込みエラーが発生しました:(error)") 92 return 93 } 94 95 } 96 //次の問題を取り出す 97 func nextQuestion() -> QuestionData? { 98 if questionDataArray.isEmpty { 99 return nil 100 } 101 let nextQuestionIndex = Int(arc4random_uniform(UInt32(questionDataArray.count))) 102 let nextQuestion = questionDataArray[nowQuestionIndex] 103 questionDataArray.remove(at: nextQuestionIndex) 104 return nextQuestion 105 } 106}

補足情報(FW/ツールのバージョンなど)

Swift3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ソース眺めただけですが、

swift

1let nextQuestion = questionDataArray[nowQuestionIndex]

じゃなくて、

swift

1let nextQuestion = questionDataArray[nextQuestionIndex]

では?

と思ったけど、これだとnowQuestionIndexの意味がなくなるから、nextQuestionIndexnowQuestionIndexに置き換えたほうがいいのかな。

投稿2018/02/05 01:23

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/05 01:34

以前のコードがnowQuestionIndexに+1して移行するものだったのでその時のが残ったままになっていたようです。 nowQuestionIndexの定義した文を消して最後だけnextQuestionIndexに直したらうまくいきました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問