gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:53:43 25 4
gpt4 key购买 nike

请耐心等待我描述这一点。我正在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com