2016-11-29 42 views
0

我在斯威夫特2取得了問答遊戲,去年,現在我需要當我把它轉化爲斯威夫特3答案現在隨機再次使用它......這裏有一個簡單的問題...結構爲什麼我的答案在我的問答遊戲中隨機化?

Questions = [Question(Question: "What is the Biggest Hit of Bing Crosby?" , Answers: ["Swinging on a Star", "Now is the Hour", "White Christmas", "Beautiful Dreamer"], Answer: 2),] 

這是我隨機化問題,並把它們放到標籤

func PickQuestions() { 

    counter += 1 
    score += 1 
    scoreLbl.text = "\(score)" 

    restartBtn.isEnabled = false 
    if Questions.count > 0 && counter <= 15 { 
     QNumber = Int(arc4random_uniform(UInt32(Questions.count))) 
     QLabel.text = Questions[QNumber].Question 

     AnswerNumber = Questions[QNumber].Answer 

     for i in 0..<Buttons.count{ 
      Buttons[i].setTitle(Questions[QNumber].Answers[i], for: UIControlState()) 
     } 

     Questions.remove(at: QNumber) 
    } 
} 

我不得不手動更改以下行這可能引起了從一個問題...

QNumber = Int(arc4random_uniform(UInt32(Questions.count))) 

QNumber = random() % Questions.count 

感謝

+2

你應該堅持Swift編程標準/命名約定。變量不應該大寫,應該是駱駝大小寫。對我們來說,你所有的變量看起來像類,可能會讓我們感到困惑,因爲那時我們認爲這些類可能以某種方式操縱數據,而我們不知道。如果它不是類,枚舉,類型,協議或結構,請不要使它們大寫。 –

回答

-1

陣列是無序的集合,這意味着他們的訂單可能會更改,恕不你知道。你最好的選擇將是創建一個包含持有這兩個問題和答案,像這樣一個結構單一的陣列:

struct QuizItem { 
    var question: String! 
    var answer: String! 
    var answerOptions: [String]! 

    init(q: String, a: String, aOptions:[String]) { 
     self.question = q 
     self.answer = a 
    } 
} 

更改聲明,如下所示: let items = [QuizItem(...)]

你這樣的代碼:

func PickQuestions() { 

    counter += 1 
    score += 1 
    scoreLbl.text = "\(score)" 

    restartBtn.isEnabled = false 
    if items.count > 0 && counter <= 15 { 
     QNumber = Int(arc4random_uniform(UInt32(Questions.count))) 
     let item = items[QNumber] 
     QLabel.text = item.question 

     for i in 0..<Buttons.count{ 
      Buttons[i].setTitle(item.answerOptions[i], for: UIControlState()) 
     } 

     items.remove(at: QNumber) 
    } 
} 

而且,那種挑剔,但值得強調的依然。 Swift是一個駱駝案例語言,雖然這個規則沒有成立,你應該嘗試並堅持廣泛認可的編碼實踐。

+2

你確定你的第一句話嗎?還是你的意思是當作爲參數傳遞?或者在什麼情況下陣列會隨機洗牌?我從來沒有一個數組沒有被命令如何我想要它,我已經使用Swift自從它出來。 –

相關問題