NSUserDefaults 在 SpriteKit Swift 中正确存储字符串



所以我设置了一个NSUserDefault来在我的GameViewController中存储一个字符串

 NSUserDefaults.standardUserDefaults().setObject("_1", forKey: "SkinSuffix")

这个想法是它存储一个后缀,我将附加到图像名称的末尾,以保存玩家应该使用的角色皮肤。

当我像这样调用 GameScene 类中的值时

var SkinSuffix = NSUserDefaults.standardUserDefaults().stringForKey("SkinSuffix")
println(SkinSuffix)
它打印"可选("_1

")"而不仅仅是"_1",所以当我尝试像这样更改图像文件的名称时,它不会加载图像文件

hero = SKSpriteNode(texture: heroAtlas.textureNamed("10Xmini_wizard(SkinSuffix)"))

如何解决此问题?

可以使用可选绑定构造解开字符串。这样可以避免在值为 nil 时应用崩溃。

if let skinSuffix = NSUserDefaults.standardUserDefaults().stringForKey("SkinSuffix") {
    println(skinSuffix)
}

更新:正如下面的评论中正确建议的那样,我将检索到的值放在一个常量 (let) 中。当我们不需要更改值时,我们应该始终使用常量。通过这种方式,Swift 编译器可以进行一些优化,并阻止我们更改该值。

那是

因为它隐式地是一个可选的,而不是类型 String 。您需要将其大小写或解开 println 语句中的可选包。

var SkinSuffix = NSUserDefaults.standardUserDefaults().stringForKey("SkinSuffix") as! String

或者在你的printlnprintln(SkinSuffix!)

作为旁注,您应该为变量名驼峰。

您可以使用"??"零聚结运算符可帮助您处理零,它还允许您指定默认字符串值。

NSUserDefaults().setObject("_1", forKey: "SkinSuffix")
let skinSuffix = NSUserDefaults().stringForKey("SkinSuffix") ?? ""
println(skinSuffix) // "_1"

最新更新