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

NSUserDefaults properly storing Strings in SpriteKit Swift

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

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

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

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

var SkinSuffix = NSUserDefaults.standardUserDefaults().stringForKey("SkinSuffix")
println(SkinSuffix)

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

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

我该如何解决这个问题?

那是因为它隐式地是 String 类型的可选 not。您需要将其大小写或在 println 语句中解包可选。

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

或者在您的 println 中:println(SkinSuffix!)

作为旁注,您应该为变量名使用驼峰命名法。

您可以使用 Optional Binding 结构解包 String。如果值为 nil,这可以避免应用程序崩溃。

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

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

你可以用“??” Nil Coalescing Operator 帮助你处理 nil,它也 允许您指定默认字符串值。

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

let skinSuffix = NSUserDefaults().stringForKey("SkinSuffix") ?? ""
println(skinSuffix) // "_1"