我需要检索一个设置(使用Swift):
var highScoreNumber: NSInteger = 0
var returnValue: [NSInteger]? = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [NSInteger]
if (returnValue != nil) {
highScoreNumber = returnValue as NSInteger
}
我尝试了这个和代码的其他变体,我总是得到
“NSInteger的?不能转换为'NSInteger'
这是我第一次涉足Swift,所以
答案 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
表示“如果returnValue
为nil
,则为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默认值而不是可选,因此不需要任何展开)