2014-12-13 61 views
1

我正在創建一個簡單的遊戲。如果玩家輸了,我希望他的當前分數與保存爲NSUserDefault的持久存儲的最佳分數相比較。我不斷收到「UINT8是無法轉換爲INT8」這是代碼用NSUserDefaults節省分數:UInt8不能轉換爲Int8

scoreForComparingWithBestScore = UInt8(score) 

      if (scoreForComparingWithBestScore > NSUserDefaults.standardUserDefaults().objectForKey("BestScore")){ 

       NSUserDefaults.standardUserDefaults().objectForKey("BestScore") =  scoreForComparingWithBestScore 

      } 

即使我輸入

scoreForComparingWithBestScore = Int8(score) 

錯誤將被切換。

在此先感謝!

回答

1

NSUserDefaults.standardUserDefaults().objectForKey("BestScore」)返回AnyObject?。要將其與UInt8(或任何其他Swift數值類型進行比較 - 您可能需要重新考慮UInt8並使用Int,除非有充分的理由堅持使用該類型),則需要同時打開可選項並將其轉換爲數字:

if let best = NSUserDefaults.standardUserDefaults().objectForKey("BestScore")?.integerValue { 
    // best will be an Int here, you can compare it to scoreForComparingWithBestScore 
} 
else { 
    // either there was no BestScore value, or there was but it wasn't an integer 
} 

或者,你可以使用??運營商如果不存在(或不爲整數),以最好成績默認爲零:

let best = NSUserDefaults 
       .standardUserDefaults() 
       .objectForKey("BestScore")? 
       .integerValue ?? 0 
+1

更簡單:'NSUserDefaults.standardUserDefaults()。integerForKey(「BestScore」)' – 2014-12-13 17:09:18

0

NSSUserDefaults具有方便的方法來存儲不同類型的的物體。

在你的情況,而不是直接存儲對象,然後試圖將它們轉換爲正確的類型,你可以只用方便的方法來代替:

if let best = NSUserDefaults.standardUserDefaults().integerForKey("BestScore") { 
    // best will be an Int here, you can compare it to scoreForComparingWithBestScore 
} 
else { 
    // There was no BestScore value. 
} 

只要你設置的值有:

NSUserDefaults.setInteger(best, forKey:"BestScore") 

則由於強類型的系統,你會知道,你已經把一個整數到默認值,然後你只需要檢查,如果這個值是該鍵的設置也不必擔心對象是否是代替正確的類型。

這也將推動您的設計,因爲您知道該值應該是Int而不是過度優化它是Int8UInt8

-1

我在這裏得到了一些關於如何保存NSUserDefaults以及如何檢索它的例子。你在這裏看到的是我如何保存來自UITextField的文本以及如何保存UIS。您還將看到我如何從NSUserDefaults中檢索這些信息。

func saveNSUserDefaults() { 
    let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults() 

    defaults.setObject(self.textFieldUrl.text + "/portal/silvertabletmenu.aspx", forKey: "url") 

    defaults.setBool(switchToolbar!.on, forKey: "toolbar"); 
    defaults.synchronize() 
} 

func loadNSUserDefaults() { 
    let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults() 

    if let urlIsNotNil = defaults.objectForKey("url") as? String { 
     self.textFieldUrl.text = defaults.objectForKey("url") as String 
    } 
    if textFieldUrl.text == "" { 
     self.textFieldUrl.text = "https://thisisjustanexample.net/" 
    } 
    switchToolbar!.on = NSUserDefaults.standardUserDefaults().boolForKey("toolbar") 
}