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

Ang*_*ker 2 optional swift

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

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

if (returnValue != nil) {
    highScoreNumber = returnValue as NSInteger
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Air*_*ity 5

将可空值转换为不可空值时,有许多好的选项可供选择.

但在你的情况下,你有两个问题.一个是你从中获取NSUserDefaults的数组是一个整数数组,所以你需要决定从那个数组中得到哪一个.

如果它是您想要的第一个,您可以使用该first属性.您可以使用可选链接来获取它.而且由于它是一个高分,如果它不存在,你可能希望默认为零.

这是一行:

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

let highscore = returnValue?.first ?? 0
Run Code Online (Sandbox Code Playgroud)

关于上述内容的注意事项:=如果类型由于右侧的内容明确地确定,则不需要将类型赋予左侧=.它是更好地喜欢IntNSInteger.

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")
Run Code Online (Sandbox Code Playgroud)

(integerForKey当不存在时已经返回0默认值而不是可选,因此不需要任何解包)