ios - Swift 数组没有正确维护项目

标签 ios arrays swift

请耐心等待我描述这一点。我正在 Xcode 中创建一个问答游戏,它可以读取问题、答案选择和文件中预期的正确答案。该文件包含 20 个问题的数据,每行用星号 (*) 分隔。第一行是问题,接下来的四行是选项,最后一行是正确答案(每个问题都重复这种格式)。

在代码中,我创建了一个字符串 (questionFileContents),其中包含包含问题的文本文件中的所有文本。

在我的 createArrays() 方法中,我创建了一个新数组,其中包含作为单独字符串的文件的每个部分(由 * 所在的位置决定)。我创建了一个包含 6 条信息(问题、选择和正确答案)的新数组 - 一旦该数组充满了 6 条信息,它就会加载到 arrayOfArrays 中,然后继续添加一个新数组另外6条信息。

希望这是有道理的。

我遇到的问题是,当我使用 print(arrayOfArrays.count) 时,它指出我在该数组中只有 17 个项目,即使我应该得到 20 个(对于 20 个不同的问题中的每一个)。当我向文本文件中添加一堆空文本时(相当于 arrayOfArrays 忽略的问题数),它会忽略它并包含之前忽略的问题。那么...是什么导致 arrayOfArrays 不包含它应该包含的 20 个项目?这是编译器错误吗,如果不是,我的逻辑哪里错了?

我已经包含了我的代码以及我从中阅读问题内容的文本文件。

提前致谢!

import UIKit

class QuestionAnswerController: UIViewController {

    @IBOutlet weak var textViewForQuestions: UITextView! // the textview which displays the current question text
    @IBOutlet weak var questionNumberView: UITextView!

    @IBOutlet weak var button1Text: UITextView! // these are the different textviews which correspond to the buttons and answers
    @IBOutlet weak var button2Text: UITextView!
    @IBOutlet weak var button3Text: UITextView!
    @IBOutlet weak var button4Text: UITextView!
    @IBOutlet weak var scoreView: UITextView! // textview which indicates the user's score

    var questionFileContents : String = "" // blank string which will contain the different contents (questions, choices, answers)
    var arrayOfArrays : Array = [[String]]() // array which contains the different arrays with their question components
    var currentTrackerOfArrays : Int = 0 // keeps track of which item from the string is being added to the addingToArray array
    var currentAnswer : String = "" // keeps track of what the correct answer is for this question
    var userScore : Int = 0 // keeps track of the user's current score
    var userSelectedAnswer : String = "" // keeps track of the user's current answer provided when they hit the answer button
    var currentQuestion : Int = 1

    @IBAction func answerButtonPressed(_ sender: UIButton) { // do something when the user presses a button

        if sender.tag == 0 { // if the button pressed is (insert num here), do this
            // sets the user's selected answer to whatever they chose
            userSelectedAnswer = """

            A
            """
            checkForCorrectAnswer() // checks to see if the answer was correct
        }
        else if sender.tag == 1 {
            userSelectedAnswer = """

            B
            """
            checkForCorrectAnswer()
        }
        else if sender.tag == 2 {
            userSelectedAnswer = """

            C
            """
            checkForCorrectAnswer()
        }
        else if sender.tag == 3 {
            userSelectedAnswer = """

            D
            """
            checkForCorrectAnswer()
        }
        newQuestionSet() // updates the list of choices as well as the question which is presented to the user

    }

    override func viewDidLoad() { // upon the view loading, do...
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        createArrays()
        updateUI()
        newQuestionSet()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func createQuestionsListString() { // takes all content from the questions file and makes a string with the content
        if let filepath = Bundle.main.path(forResource: "TriviaQuestions-Formatted", ofType: "txt") { // the main filepath for the file
            do {
                let contents = try String(contentsOfFile: filepath) // attempts to make string with file
                questionFileContents = contents // sets the questionFileContents variable to the contents of the file
            } catch let error as NSError { // in the event of an error, do...
                // contents could not be loaded
                print("Contents could not be loaded.")
                print(error.description)
            }
        }
    }

    func newQuestionSet() { // sets all the different elements of the user interface for the next question

        if arrayOfArrays.count > 0 { // if there is still questions left in the array, do...
            let randomQuestionInt = Int(arc4random_uniform(UInt32(arrayOfArrays.count) - 1)) // chooses a random question number
            textViewForQuestions.text = arrayOfArrays[randomQuestionInt][0] // sets the text of the question
            button1Text.text = arrayOfArrays[randomQuestionInt][1] // these set the different choices' text to be the choices from the question array
            button2Text.text = arrayOfArrays[randomQuestionInt][2]
            button3Text.text = arrayOfArrays[randomQuestionInt][3]
            button4Text.text = arrayOfArrays[randomQuestionInt][4]
            currentAnswer = arrayOfArrays[randomQuestionInt][5] // sets the current correct answer
            arrayOfArrays.remove(at: randomQuestionInt) // prevents repeated questions
//            print(arrayOfArrays.count)
        }
        else { // in the event that there are no more questions remaining, do...
            textViewForQuestions.text = "Finished."
            currentAnswer = ""
        }
    }

    func updateUI() { // updates the user interface with the current score
        scoreView.text = "Score: \(userScore)"
        questionNumberView.text = "Question number: \(currentQuestion)"
    }

    func checkForCorrectAnswer() {
        if userSelectedAnswer == String(currentAnswer) { // if the user selected answer is the same as the correct answer for the question, do...
            userScore += 1 // update the score
            currentQuestion += 1
            updateUI() // update the UI with the new score
        }
        else {
            currentQuestion += 1 
            updateUI()
        }
    }

    func createArrays() { // creates the arrays for the questions and the array of arrays
        createQuestionsListString() // calls the method to make the string from the questions file

        let questionPiecesArray = questionFileContents.split(separator: "*") // breaks apart the string based on where an asterix is located (and puts the pieces in an array)
        var addingToArray : Array = [String]() // the array which contains the different components of the question (question, choices, correct answer) which will be added to the array of arrays

        for _ in questionPiecesArray { // for however many pieces are in the questionPiecesArray, do...

            if addingToArray.count >= 6 { // if the array storing the current question gets filled with 6 or more objects, do...
                arrayOfArrays.append(addingToArray) // adds the question array to the array containing all the question arrays
                addingToArray.removeAll() // empties the question array to make room for new question components
            }
            else if addingToArray.count <= 6 { // if the array isn't full, do...
                addingToArray.append(String(questionPiecesArray[currentTrackerOfArrays])) // addsar the current question component (from questionPiecesArray) to the question array
                currentTrackerOfArrays += 1 // moves onto the next piece of information
            }

        }

        print(arrayOfArrays.count)
        print(questionPiecesArray.count)
        print(arrayOfArrays)

        // current problem, the array of arrays is maxing out at holding 17 arrays and won't hold anymore ...
        // this problem makes no sense because the print(questionPiecesArray.count) method is showing ...
        // that there are 120+ objects in the array so the for loop should add that many objects to the various arrays
        // through testing it seems that the arrayOfArrays always has 4 less arrays than it should
        // I'll just repeat the last 4 questions again so that they get included in the mix (?)...
        // Perhaps it would be better to put in meaningless text for the last 4 blank question templates so that if a glitch occurs it will be more obvious
        // Yeah, I'll do that
        // Test: it seems to be working well with the empty text 
    }

}

这是它正在读取的 txt 文件中包含的内容:

How do crickets hear?*
Through their wings*
Through their belly*
Through their knees*
Through their tongue*
C*
Which American city invented plastic vomit?*
Chicago*
Detroit*
Columbus*
Baltimore*
A*
In ‘Ben Hur’, which modern thing can be seen during the chariot scene?*
A waitress*
A car*
A postbox*
A street lamp*
B*
What was Karl Marx’s favorite color?*
Brown*
Blue*
Red*
Purple*
C*
What’s the best way to stop crying while peeling onions?*
Lick almonds*
Suck lemons*
Eat cheese*
Chew gum*
D*
How old was the youngest Pope?*
11*
17*
22*
29*
A*
Which animal sleeps for only five minutes a day?*
A chameleon*
A koala*
A giraffe*
A beaver*
C*
How many words in the English language end in “dous"?*
Two*
Four*
Six*
Eight*
B*
One human hair can support how many kilograms?*
Three*
Five*
Seven*
Nine*
A*
The bikini was originally called the what?*
Poke*
Range*
Half*
Atom*
D*
Which European city is home to the Fairy Investigation Society?*
Poznan*
Dublin*
Bratislava*
Tallinn*
B*
What’s a frog’s favourite colour?*
Blue*
Orange*
Yellow*
Brown*
A*
Which one of these planets rotates clockwise?*
Uranus*
Mercury*
Pluto*
Venus*
D*
What perspires half a pint of fluid a day?*
Your scalp*
Your armpits*
Your feet*
Your buttocks*
C*
St Stephen is the patron saint of who?*
Plumbers*
Bricklayers*
Roofers*
Carpenters*
B*
Which country leads the world in cork production?*
Greece*
Australia*
Spain*
Mexico*
C*
On average, what do you do 15 times a day?*
Laugh*
Burp*
Break wind*
Lick your lips*
A*
What colour was Coca-Cola originally?*
Red*
Purple*
Beige*
Green*
D*
Bubble gum contains what?*
Plastic*
Calcium*
Rubber*
Pepper*
C*
The inventor of the paint roller was of which nationality?*
Hungarian*
Canadian*
Norwegian*
Argentinian*
B*

请注意:从文本文件读取没有问题。

最佳答案

问题出在您的else if 语句中。使用这个 for 循环来获得正确的结果(我已经测试过了):

for item in questionPiecesArray {
    // always add the current item to the array
    addingToArray.append(String(item))

    // if it was last for the current question, reset the addingToArray
    if addingToArray.count >= 6 {
        arrayOfArrays.append(addingToArray)
        addingToArray.removeAll()
    }
}

此外,使用它您将不再需要 currentTrackerOfArrays

关于ios - Swift 数组没有正确维护项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48929142/

相关文章:

ios - 如果关闭 webView 如何重新加载旧 View ?

ios - NS文件管理器 :moveItemAtPath

ios - UIPickerview 不会根据不同 uitextfield 的值从特定数组填充

javascript - 迭代 NodeList 并移动其元素而不转换为数组的惯用方法是什么?

java - 返回错误的数组索引

c++ - 将数组本地抛出到 try block

ios - iPhone 清除 TableView 单元格,使其保持新鲜状态

iOS swift : Best practices for starting app with an alternative UIViewController

ios - Mach-O 链接器警告 : too many personality routines for compact unwind to encode

ios - Realm swift 2.0 : "Operation not permitted" - only on device