2015-05-22 55 views
2

我需要檢索的設置(與SWIFT):如何將可選的NSInteger轉換爲非可選的NSInteger?

var highScoreNumber: NSInteger = 0 
var returnValue: [NSInteger]? = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [NSInteger] 

if (returnValue != nil) { 
    highScoreNumber = returnValue as NSInteger 
} 

我想這和代碼的其他變化,我總是得到

'NSInteger的?'無法轉換爲「NSInteger的」

這是我首次涉足斯威夫特,所以

  1. 我缺少的東西在轉換簡單嗎?
  2. 有沒有更好的方法從設置檢索NSInteger?
+3

您應該使用的,而不是NSInteger的的 –

+0

可能重複INT [在斯威夫特,我該怎麼辦避免選項和零對象引用?](http://stackoverflow.com/questions/27622871/in-swift-how-do-i-avoid-both-optionals-and-nil-object-references) – nhgrif

+1

有沒有你想使用NSInteger而不是Int的具體原因? – Bas

回答

5

將空值轉換爲非空值時,有many good options to choose from

但在你的情況下,你有兩個問題。其中一個是你從NSUserDefaults獲取的數組是一個整數數組,所以你需要決定從數組中選擇哪一個。

如果這是您需要的第一個,您可以使用first屬性。你可以使用可選的鏈接來獲取它。而且由於它的得分很高,如果它不存在,你可能想要默認爲零。

下面是在一行:

let returnValue = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [Int] 

let highscore = returnValue?.first ?? 0 

事情需要注意上述:有沒有必要給類型的=的左側,如果該類型明確由什麼綠水青山權確定=Int優於NSInteger

returnValue?.first說「如果returnValuenil,然後nil,的first(如果該數組爲空時,它本身,則返回nil)。否則該值」的??說「如果??左邊是nil,則值在nil的右側,否則從左側展開的值「。

這就是說 - 你真的想要存儲數組嗎?或者你真的只想在默認值中存儲一個整數,然後直接將其取出?

let highscore = NSUserDefaults.standardUserDefaults().integerForKey("food") 
// and elsewhere in your code, when saving 
NSUserDefaults.standardUserDefaults().setInteger(highscore, forKey: "food") 

integerForKey已經返回0默認情況下不存在,而不是一個可選的,因此不需要任何解包)

+0

其實你是對的。我只想存儲一個整數。 – AngryHacker