json - 为什么我的 Swift 代码无法根据 .json 数据中的值正确计算分数

标签 json swift

首先我要说的是,我是编程新手,因此这可能只是一个愚蠢的新手错误。我确实尝试在网上找到答案,但也许我没有寻找正确的东西,因为我找不到解决方案。

简而言之,我正在尝试根据多个变量计算益智游戏应用程序中的分数。这些变量之一根据 .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的值, currentCorrectAnswerIndexquestionvalue .

print("Answer Number: \(answerNumber)")
print("Currently Correct Idx: \(currentCorrectAnswerIndex)")
print("Question Value: \(questionvalue)")

调试的关键是确保您的变量(程序状态)符合您的预期。如果控制台(Xcode 的底部选项卡)没有打印任何内容,则不会调用 CheckAnswer。如果answerNumbercurrentCorrectAnswerIndex 不同那么你的内心陈述就不会被调用。如果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 += ba = 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/

相关文章:

json - 在函数内调用函数并返回字符串

ios - 动画自定义按钮 iOS Swift

ios - 如何制作一个 TableView 的多个实例?

android - 为什么我会收到 "Permission Denied"错误?

ios - 根据维护顺序快速解析json

objective-c - 在 Objective-C 中使用 CACornerMask

swift - 快速的 SHA256

ios - 在 Xcode 中的 .Swift 文件之间传递数据

javascript - 大负载上的 WSO2ESB js 脚本调解器错误

ruby - 如何使用 rails 仅查找 google 加一计数(不需要按钮和 g +1 图像)