首先我要说的是,我是编程新手,因此这可能只是一个愚蠢的新手错误。我确实尝试在网上找到答案,但也许我没有寻找正确的东西,因为我找不到解决方案。
简而言之,我正在尝试根据多个变量计算益智游戏应用程序中的分数。这些变量之一根据 .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 中使用哪种计算的方法。然而,每当用户得到正确答案时,得分值都保持为零。
我还尝试通过将 var Questionvalue :String?
更改为 var Questionvalue :Int!
来使用 .json 文件中存储在“value”标签中的数据并将 let Questionvalue : NSString = entry.objectForKey("difficulty") 更改为! NSString
在我的 LoadQuestion 函数中 让 Questionvalue : NSInteger = entry.objectForKey("value") as! Int
并更改我的 CheckAnswer 函数,以便它引用这些值(即“1”而不是“Beginner”,依此类推)。
我还尝试更改 .json 文件中的数据,以使数值不是字符串。
但是可惜这些都不起作用。作为一个新手,我确信我只是错过了一些明显的东西,但我似乎找不到答案。我怀疑我没有在这里或在谷歌上搜索正确的东西。如果是这样的话,我希望有一些链接可以查看。或者,如果它像我怀疑的那样简单,那么我的代码的解决方案将会很棒。
最佳答案
感谢您花时间清楚地写出您的问题。我猜测 JSON 正在正确加载,因为您正在强制转换并且没有崩溃。这将是一个很长的答案,向您展示我将如何调试您的问题。
我会在你的 CheckAnswer
中开始调试函数,因为这就是您要更改和计算分数的地方。一开始临时添加如下代码,打印出answerNumber
的值, currentCorrectAnswerIndex
和questionvalue
.
print("Answer Number: \(answerNumber)")
print("Currently Correct Idx: \(currentCorrectAnswerIndex)")
print("Question Value: \(questionvalue)")
调试的关键是确保您的变量(程序状态)符合您的预期。如果控制台(Xcode 的底部选项卡)没有打印任何内容,则不会调用 CheckAnswer。如果answerNumber
与 currentCorrectAnswerIndex
不同那么你的内心陈述就不会被调用。如果questionvalue
不是您可能的值之一,那么您可能需要检查您认为设置该值的所有位置。
剧透:
问题值将为零
block 引用>所以你发现了一个意想不到的值,你会做什么?首先是质疑你的假设。您假设该变量是在其他地方设置/修改的,但显然不是。检查您认为设置/修改值的所有位置。有时您必须多次执行此操作,越来越深入地了解代码。
解决方案:
在
block 引用>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}
关于json - 为什么我的 Swift 代码无法根据 .json 数据中的值正确计算分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35932342/