2016-03-11 12 views
2

讓我首先說我是編程新手,因此這可能只是一個愚蠢的新手錯誤。我確實嘗試在網上找到答案,但也許我沒有找到正確的東西,因爲我找不到解決方案。爲什麼我的Swift代碼不能根據.json數據中的值正確計算分數

簡而言之,我試圖根據許多變量計算瑣事遊戲應用中的分數。其中一個變量決定了基於.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數據持續這樣的數百個問題。

現在我斯威夫特代碼中我加載我以.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文件中的數據試了試var questionvalue :String?var questionvalue :Int!和改變我的LoadQuestion功能let questionvalue : NSString = entry.objectForKey("difficulty") as! NSStringlet questionvalue : NSInteger = entry.objectForKey("value") as! Int和改變我的CheckAnswer功能,因此,它的這些值引用相反(即「1」而不是「初學者」,等等)。

我也嘗試更改我的.json文件中的數據,以便數值不是字符串。

但唉這一切都沒有奏效。作爲一個新手,我確信我只是錯過了一些明顯的東西,但我似乎無法找到答案。我懷疑我沒有在這裏或在Google上尋找正確的東西。如果是這樣的話,我會很高興看到一些鏈接。或者,如果像我懷疑的那樣直截了當,我的代碼解決方案將會很棒。

回答

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} 
+0

首先,非常感謝您通過調試過程。這非常有幫助。你是對的,我沒有意識到'如果' - 這應該使我的代碼在很多地方變得更清潔!現在,我沒有在我的問題(我的錯!)中提到這一點,但我已經嘗試通過刪除'let'來更改我的LoadQuestion中的代碼,但是這樣做會導致Xcode生成錯誤。但是,我再次嘗試這一點,並提示將其更改爲:'questionvalue = entry.objectForKey(「困難」)! NSString作爲字符串(即添加'作爲字符串'的結束。這工作!!謝謝!:) – Monomeeth

+0

此外,謝謝你解釋我的原始'let questionvalue:NSString = entry.objectForKey(「難度」)爲! NSString'實際上並沒有爲我之前聲明的變量賦值。這是我的另一個學習。 :) – Monomeeth

+0

因爲'questionvalue'是一個'String',你不能給它分配一個'NSString'值。你可以使用'as String'將'NSString'類型轉換爲'String',這就是爲什麼'as! NSString作爲字符串'工作。你實際上可以強制轉換爲'String'。例如。 'entry.objectForKey(「難度」)爲! String' – Kevin

相關問題