我正在製作測驗應用程序。該應用程序使用.json文件作爲問題和答案的「數據庫」。這個.json文件看起來如下...在iOS中隨機顯示字符串而不重複它們
{
"id" : "1",
"question": "Earth is a:",
"answers": [
"Planet",
"Meteor",
"Star",
"Asteroid"
],
"difficulty": "1"
}
...並且只是繼續超過500個問題。
我用下面的代碼隨機顯示的問題:
let randomNumber = Int(arc4random_uniform(UInt32(allEntries.count)))
LoadQuestion(randomNumber)
這項工作很好,但因爲它選擇的問題隨機我發現,問題都被定期(即使我有超過500個重複問題!)。
我已經對此進行了廣泛的研究,並認爲或許我讀了太多,因爲我現在很困惑。我已經閱讀過關於「播種」的內容,關於保存問題索引以及嘗試使用NSUserDefault。
總之,我怎麼能修改我的代碼來實現以下成果之一,而不是:
- 不重複在所有的任何問題,但停止問問題時,所有的問題都已經問一次;
- 與上面的1類似,但具有由用戶設置的問題數量而不是詢問數據庫中的所有問題;
- 不要重複任何問題,直到首先詢問所有問題;或者,
- 要不重複以前已正確回答的任何問題,但可能會重複錯誤回答的問題。
下面就是我的想法是代碼的相關位:
LoadAllQuestionsAndAnswers()
let randomNumber = Int(arc4random_uniform(UInt32(allEntries.count)))
LoadQuestion(randomNumber)
func LoadAllQuestionsAndAnswers()
{
let path = NSBundle.mainBundle().pathForResource("content", ofType: "json")
let jsonData : NSData = NSData(contentsOfFile: path!)!
allEntries = (try! NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers)) as! NSArray
//println(allEntries)
}
func LoadQuestion(index : Int)
{
let entry : NSDictionary = allEntries.objectAtIndex(index) as! NSDictionary
let question : NSString = entry.objectForKey("question") as! NSString
let arr : NSMutableArray = entry.objectForKey("answers") as! NSMutableArray
//println(question)
//println(arr)
labelQuestion.text = question as String
let indices : [Int] = [0,1,2,3]
//let newSequence = shuffle(indices)
let newSequence = indices.shuffle()
var i : Int = 0
for(i = 0; i < newSequence.count; i++)
{
let index = newSequence[i]
if(index == 0)
{
// we need to store the correct answer index
currentCorrectAnswerIndex = i
}
let answer = arr.objectAtIndex(index) as! NSString
switch(i)
{
case 0:
buttonA.setTitle(answer as String, forState: UIControlState.Normal)
break;
case 1:
buttonB.setTitle(answer as String, forState: UIControlState.Normal)
break;
case 2:
buttonC.setTitle(answer as String, forState: UIControlState.Normal)
break;
case 3:
buttonD.setTitle(answer as String, forState: UIControlState.Normal)
break;
default:
break;
}
}
buttonNext.hidden = true
// we will need to reset the buttons to reenable them
ResetAnswerButtons()
}
@IBAction func PressedButtonNext(sender: UIButton) {
print("button Next pressed")
let randomNumber = Int(arc4random_uniform(UInt32(allEntries.count)))
LoadQuestion(randomNumber)
}
謝謝你的建議。這對我來說是全新的,所以你說的大部分內容都像是讀一門外語,但我會試着再次研究NSUserDefaults。如果有什麼可以推薦給我的,或者甚至是一些代碼示例,那就太棒了。 感謝您對以下命名約定的建議 - 我甚至不知道函數應該以小寫開頭,因此我將更正所有代碼。 – Monomeeth
OP,我的確嘗試着寫更詳細的代碼給你,所以你可以理解正在發生什麼,而不是從SO編寫代碼;) – SmokeDispenser
太棒了。我現在正在研究NSUserDedaults,試圖讓我的頭腦轉向它。有一件事,你能澄清爲什麼我需要以正確的順序保存所有的隨機數嗎?我試圖讓我的頭瞭解爲什麼訂單很重要,並且爲什麼它不會自動按照正確的順序放行? – Monomeeth