如何将可选的NSInteger转换为非可选的NSInteger?

时间:2015-05-22 21:56:52

标签: swift optional

我需要检索一个设置(使用Swift):

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

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

我尝试了这个和代码的其他变体,我总是得到

  

“NSInteger的?不能转换为'NSInteger'

这是我第一次涉足Swift,所以

  1. 我在转换中遗漏了一些简单的内容吗?
  2. 有没有更好的方法从设置中检索NSInteger?

1 个答案:

答案 0 :(得分: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默认值而不是可选,因此不需要任何展开)