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

How do I convert a optional NSInteger to a non-optional one?

我需要检索设置(Swift):

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

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

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

'NSInteger?' not convertible to 'NSInteger'

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

  1. 我在转换过程中是否漏掉了一些简单的东西?
  2. 是否有更好的方法从设置中检索 NSInteger?

将可空值转换为不可空值时,有

但是对于你的情况,你有两个问题。一个是您要从中获取的数组 NSUserDefaults 是一个整数数组,因此您需要决定要从该数组中获取哪个数组。

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

这是一行:

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

let highscore = returnValue?.first ?? 0

关于上面的注意事项:如果类型由 = 右侧的内容明确确定,则无需提供 = 左侧的类型。而且最好选择 Int 而不是 NSInteger

returnValue?.first 说“如果 returnValuenil,那么 nil,否则 first 的值(它本身,returns nil 如果数组为空)。” ?? 表示“如果 ?? 的左边是 nil,那么 nil 右边的值,否则是左边的展开值”。

就是说 – 您真的是要存储数组吗?或者你真的只是想在默认值中存储一个整数然后直接把它取出来?

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

integerForKey 已经 returns 不存在时默认为 0 而不是可选的,因此不需要任何解包)