首先让我说我是编程新手,因此这可能只是一个愚蠢的新手错误。我确实尝试在线找到答案,但也许我没有找到正确的东西,因为我找不到解决方案。
简而言之,我试图根据一些变量计算琐事游戏应用中的分数。其中一个变量根据.json文件中的数据确定要回答的问题的“值”。也就是说,所有问题,答案,值等都存储在.json文件中。
.json文件采用以下格式:
[
{
"id":"1",
"question":"Which planet do we live on?",
"answers":[
"Earth",
"Mars",
"Venus",
"Jupiter"
],
"difficulty":"Beginner",
"value":"1"
},
{
"id":"2",
"question":"In what year did the Prime Minister of Australia literally just vanish?",
"answers":[
"1967",
"1975",
"2001",
"1939"
],
"difficulty":"Hardest",
"value":"6"
},
.json数据以数百个问题继续这样做。
现在在我的Swift代码中,我以这种方式加载我的.json数据:
func LoadAllQuestionsAndAnswers()
{
let path = NSBundle.mainBundle().pathForResource("trivia", ofType: "json")
let jsonData : NSData = NSData(contentsOfFile: path!)!
allEntries = (try! NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers)) as! NSArray
//println(allEntries)
}
我还宣布了以下变量:
var questionvalue :String?
var currentgoals :Int! = 0
var currentbehinds :Int! = 0
var currenttotal :Int! = 0
我用来加载我的问题的代码是:
func LoadQuestion(index : Int)
{
let entry : NSDictionary = shuffledQuestions[index] as! NSDictionary
let question : NSString = entry.objectForKey("question") as! NSString
let arr : NSMutableArray = entry.objectForKey("answers") as! NSMutableArray
let questionvalue : NSString = entry.objectForKey("difficulty") as! NSString
let QID : NSString = entry.objectForKey("id") as! NSString
if let a = arr.objectAtIndex(0) as? String {
self.answertext = a
}
现在得分。得分涉及“目标”,“落后”和“总计”。目标值6分,落后值1分。根据问题的难度,用户可以得分为1,2,3或4分或目标。
我的评分的相关代码如下:
func CheckAnswer( answerNumber : Int)
{
if(answerNumber == currentCorrectAnswerIndex)
{
// we have the correct answer
if questionvalue == "Beginner" {currentbehinds = currentbehinds+1}
else{
if questionvalue == "Easy" {currentbehinds = currentbehinds+2}
else{
if questionvalue == "Intermediate" {currentbehinds = currentbehinds+3}
else{
if questionvalue == "Hard" {currentbehinds = currentbehinds+4}
else{
if questionvalue == "Hardest" {currentgoals = currentgoals+1}
}
}
}
}
labelCurrentGoals.text = "\(currentgoals)"
labelCurrentBehinds.text = "\(currentbehinds)"
labelCurrentTotal.text = "\(currenttotal)"
currenttotal = (currentgoals*6) + currentbehinds
正如您所看到的,实际的计算是在我的Swift代码中完成的,它们不是使用.json文件中的数据完成的。我只想引用存储在.json文件中的“难度”或“值”作为确定应用程序使用的Swift中的哪个计算的方法。但是,每当用户得到正确答案时,分数值都保持为零。
我还尝试使用我的.json文件中“value”标签中存储的数据,将var questionvalue :String?
更改为var questionvalue :Int!
并将我的LoadQuestion函数中的let questionvalue : NSString = entry.objectForKey("difficulty") as! NSString
更改为{ {1}}并更改我的CheckAnswer函数,以便它引用这些值(即“1”而不是“Beginner”,依此类推)。
我还尝试更改.json文件中的数据,以便数值不是字符串。
但是这一切都没有效果。作为一个新手,我确信我只是遗漏了一些明显的东西,但我似乎无法找到答案。我怀疑我不是在这里或谷歌上搜索正确的东西。如果是这样的话,我会很感激一些链接。或者,如果它像我怀疑的那样简单,那么我的代码解决方案就会很棒。
答案 0 :(得分:2)
感谢您花时间清楚地写出您的问题。我猜测JSON正在被正确加载,因为你是强制转换而不是崩溃。这将是一个很长的答案,向您展示如何调试您的问题。
我会在你的CheckAnswer
函数中开始调试,因为那是你改变和计算分数的地方。首先,暂时添加以下代码以打印answerNumber
,currentCorrectAnswerIndex
和questionvalue
的值。
print("Answer Number: \(answerNumber)")
print("Currently Correct Idx: \(currentCorrectAnswerIndex)")
print("Question Value: \(questionvalue)")
调试的关键是确保您的变量(程序状态)符合您的预期。如果没有任何内容打印到控制台(Xcode的底部选项卡),则不会调用CheckAnswer。如果answerNumber
与currentCorrectAnswerIndex
不同,则不会调用您的内部语句。如果questionvalue
不是您可能的值之一,那么您可能需要检查您认为设置该值的所有位置。
扰流:
questionvalue将是零
所以你发现了一个出乎意料的价值,你做了什么?首先是质疑你的假设。您假设变量在其他地方设置/修改,但显然不是。检查您认为设置/修改值的所有位置。有时你需要多次这样做,越来越深入你的代码。
解决方案:
在
LoadQuestion
中,您可以从JSON获取问题的值并将其分配给局部变量。let questionvalue : NSString = entry.objectForKey("difficulty") as! NSString
。 该问题值与页面顶部的问题值不同(var questionvalue :String?
)。 您可以通过删除let来分配该值;现在引用类中的变量而不是LoadQuestion
函数中的局部变量questionvalue = entry.objectForKey("difficulty") as! NSString
此外,这里有一些您可能不知道的编程事项。如果您要测试几个不同的条件,则可以使用else if
。 a += b
是a = a + b
的简写语法(这样做很多,所以程序员想出了这个快捷方式)。
if questionvalue == "Beginner" {currentbehinds += 1}
else if questionvalue == "Easy" {currentbehinds += 2}
else if questionvalue == "Intermediate" {currentbehinds += 3}
else if questionvalue == "Hard" {currentbehinds += 4}
else if questionvalue == "Hardest" {currentgoals += 1}