为什么我的Swift代码无法根据.json数据

时间:2016-03-11 04:39:06

标签: 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中的哪个计算的方法。但是,每当用户得到正确答案时,分数值都保持为零。

我还尝试使用我的.json文件中“value”标签中存储的数据,将var questionvalue :String?更改为var questionvalue :Int!并将我的LoadQuestion函数中的let questionvalue : NSString = entry.objectForKey("difficulty") as! NSString更改为{ {1}}并更改我的CheckAnswer函数,以便它引用这些值(即“1”而不是“Beginner”,依此类推)。

我还尝试更改.json文件中的数据,以便数值不是字符串。

但是这一切都没有效果。作为一个新手,我确信我只是遗漏了一些明显的东西,但我似乎无法找到答案。我怀疑我不是在这里或谷歌上搜索正确的东西。如果是这样的话,我会很感激一些链接。或者,如果它像我怀疑的那样简单,那么我的代码解决方案就会很棒。

1 个答案:

答案 0 :(得分:2)

感谢您花时间清楚地写出您的问题。我猜测JSON正在被正确加载,因为你是强制转换而不是崩溃。这将是一个很长的答案,向您展示如何调试您的问题。

我会在你的CheckAnswer函数中开始调试,因为那是你改变和计算分数的地方。首先,暂时添加以下代码以打印answerNumbercurrentCorrectAnswerIndexquestionvalue的值。

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

调试的关键是确保您的变量(程序状态)符合您的预期。如果没有任何内容打印到控制台(Xcode的底部选项卡),则不会调用CheckAnswer。如果answerNumbercurrentCorrectAnswerIndex不同,则不会调用您的内部语句。如果questionvalue不是您可能的值之一,那么您可能需要检查您认为设置该值的所有位置。

扰流:

  

questionvalue将是零

所以你发现了一个出乎意料的价值,你做了什么?首先是质疑你的假设。您假设变量在其他地方设置/修改,但显然不是。检查您认为设置/修改值的所有位置。有时你需要多次这样做,越来越深入你的代码。

解决方案:

  

LoadQuestion中,您可以从JSON获取问题的值并将其分配给局部变量。  let questionvalue : NSString = entry.objectForKey("difficulty") as! NSString。  该问题值与页面顶部的问题值不同(var questionvalue :String?)。  您可以通过删除let来分配该值;现在引用类中的变量而不是LoadQuestion函数中的局部变量  questionvalue = entry.objectForKey("difficulty") as! NSString

此外,这里有一些您可能不知道的编程事项。如果您要测试几个不同的条件,则可以使用else ifa += 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}