我从 NSUserDefaults 得到的对象(字典)有问题
Problems with the object ( dictionary ) I get from NSUserDefaults
尽管该应用运行良好,但我的两行代码仍然收到此警告消息。我想做的是从两个玩家那里得到以前的分数:
全局变量:
// 玩家 1 的初始分数为 0 ,玩家 2 也是。
var countWins:Dictionary = ["1":0,"2":0]
警告:
Treating a forced downcast to 'Int' as optional will never produce
'nil'
在线 ->
countWins["1"] = defaults.objectForKey("scoreOne") as! Int
countWins["2"] = defaults.objectForKey("scoreTwo") as! Int
整个函数:
func loadScores()
{
let defaults = NSUserDefaults.standardUserDefaults()
if defaults.objectForKey("scoreOne") != nil &&
defaults.objectForKey("scoreTwo") != nil
{
countWins["1"] = defaults.objectForKey("scoreOne") as! Int
countWins["2"] = defaults.objectForKey("scoreTwo") as! Int
scorePlayerOne.text = String(countWins["1"]!)
scorePlayerTwo.text = String(countWins["2"]!)
}
}
我不知道这是否重要,但我从 func viewDidLoad() 调用函数,因为这是我尝试在应用程序返回时加载以前的分数的逻辑。
一定是概念错误。可选对象一直让我陷入困境。 ;)
提前致谢
您可以将其视为 conditional
向下转换为 Int
而不是 optional
的 :
countWins["1"] = defaults.objectForKey("scoreOne") as? Int
countWins["2"] = defaults.objectForKey("scoreTwo") as? Int
否则,如果您需要可选的,则在其周围添加括号以消除警告:
countWins["1"] = (defaults.objectForKey("scoreOne") as! Int)
countWins["2"] = (defaults.objectForKey("scoreTwo") as! Int)
如果键没有改变,不要在用户默认值中使用可选值
在AppDelegate
中用默认值注册键,将代码放在awakeFromNib()
中或更好地放在init()
中
let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["scoreOne" : 0, "scoreTwo" : 0];
defaults.registerDefaults(defaultValues)
如果 none 个密钥已写入磁盘,则用户默认值采用默认值,否则为实际值。
现在您可以将值加载为非可选值
func loadScores()
{
let defaults = NSUserDefaults.standardUserDefaults()
let scoreOne = defaults.integerForKey("scoreOne")
let scoreTwo = defaults.integerForKey("scoreTwo")
countWins["1"] = scoreOne
countWins["2"] = scoreTwo
scorePlayerOne.text = String(scoreOne)
scorePlayerTwo.text = String(scoreTwo)
}
没有可选绑定 - 没有类型转换。
您真的应该使用可选绑定。它将消除您的警告,并增加您的应用程序的安全性。
var countWins:Dictionary = ["1":0,"2":0]
func loadScores() {
let defaults = NSUserDefaults.standardUserDefaults()
if let scoreOne = defaults.objectForKey("scoreOne") as? Int,
let scoreTwo = defaults.objectForKey("scoreTwo") as? Int {
countWins["1"] = scoreOne
countWins["2"] = scoreTwo
scorePlayerOne.text = "\(scoreOne)"
scorePlayerTwo.text = "\(scoreTwo)"
}
else {
scorePlayerOne.text = "\(0)"
scorePlayerTwo.text = "\(0)"
}
}
你最好直接从 userdefaults 中提取整数值
countWins["1"] = defaults.integerForKey("scoreOne")
countWins["2"] = defaults.integerForKey("scoreTwo")
尽管该应用运行良好,但我的两行代码仍然收到此警告消息。我想做的是从两个玩家那里得到以前的分数:
全局变量:
// 玩家 1 的初始分数为 0 ,玩家 2 也是。
var countWins:Dictionary = ["1":0,"2":0]
警告:
Treating a forced downcast to 'Int' as optional will never produce 'nil'
在线 ->
countWins["1"] = defaults.objectForKey("scoreOne") as! Int
countWins["2"] = defaults.objectForKey("scoreTwo") as! Int
整个函数:
func loadScores()
{
let defaults = NSUserDefaults.standardUserDefaults()
if defaults.objectForKey("scoreOne") != nil &&
defaults.objectForKey("scoreTwo") != nil
{
countWins["1"] = defaults.objectForKey("scoreOne") as! Int
countWins["2"] = defaults.objectForKey("scoreTwo") as! Int
scorePlayerOne.text = String(countWins["1"]!)
scorePlayerTwo.text = String(countWins["2"]!)
}
}
我不知道这是否重要,但我从 func viewDidLoad() 调用函数,因为这是我尝试在应用程序返回时加载以前的分数的逻辑。
一定是概念错误。可选对象一直让我陷入困境。 ;)
提前致谢
您可以将其视为 conditional
向下转换为 Int
而不是 optional
的 :
countWins["1"] = defaults.objectForKey("scoreOne") as? Int
countWins["2"] = defaults.objectForKey("scoreTwo") as? Int
否则,如果您需要可选的,则在其周围添加括号以消除警告:
countWins["1"] = (defaults.objectForKey("scoreOne") as! Int)
countWins["2"] = (defaults.objectForKey("scoreTwo") as! Int)
如果键没有改变,不要在用户默认值中使用可选值
在AppDelegate
中用默认值注册键,将代码放在awakeFromNib()
中或更好地放在init()
let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["scoreOne" : 0, "scoreTwo" : 0];
defaults.registerDefaults(defaultValues)
如果 none 个密钥已写入磁盘,则用户默认值采用默认值,否则为实际值。
现在您可以将值加载为非可选值
func loadScores()
{
let defaults = NSUserDefaults.standardUserDefaults()
let scoreOne = defaults.integerForKey("scoreOne")
let scoreTwo = defaults.integerForKey("scoreTwo")
countWins["1"] = scoreOne
countWins["2"] = scoreTwo
scorePlayerOne.text = String(scoreOne)
scorePlayerTwo.text = String(scoreTwo)
}
没有可选绑定 - 没有类型转换。
您真的应该使用可选绑定。它将消除您的警告,并增加您的应用程序的安全性。
var countWins:Dictionary = ["1":0,"2":0]
func loadScores() {
let defaults = NSUserDefaults.standardUserDefaults()
if let scoreOne = defaults.objectForKey("scoreOne") as? Int,
let scoreTwo = defaults.objectForKey("scoreTwo") as? Int {
countWins["1"] = scoreOne
countWins["2"] = scoreTwo
scorePlayerOne.text = "\(scoreOne)"
scorePlayerTwo.text = "\(scoreTwo)"
}
else {
scorePlayerOne.text = "\(0)"
scorePlayerTwo.text = "\(0)"
}
}
你最好直接从 userdefaults 中提取整数值
countWins["1"] = defaults.integerForKey("scoreOne")
countWins["2"] = defaults.integerForKey("scoreTwo")