我需要检索一个设置(使用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,所以
将可空值转换为不可空值时,有许多好的选项可供选择.
但在你的情况下,你有两个问题.一个是你从中获取NSUserDefaults的数组是一个整数数组,所以你需要决定从那个数组中得到哪一个.
如果它是您想要的第一个,您可以使用该first属性.您可以使用可选链接来获取它.而且由于它是一个高分,如果它不存在,你可能希望默认为零.
这是一行:
let returnValue = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [Int]
let highscore = returnValue?.first ?? 0
Run Code Online (Sandbox Code Playgroud)
关于上述内容的注意事项:=如果类型由于右侧的内容明确地确定,则不需要将类型赋予左侧=.它是更好地喜欢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")
Run Code Online (Sandbox Code Playgroud)
(integerForKey当不存在时已经返回0默认值而不是可选,因此不需要任何解包)