所以我设置了一个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
或者在你的println
:println(SkinSuffix!)
作为旁注,您应该为变量名驼峰。
您可以使用"??"零聚结运算符可帮助您处理零,它还允许您指定默认字符串值。
NSUserDefaults().setObject("_1", forKey: "SkinSuffix")
let skinSuffix = NSUserDefaults().stringForKey("SkinSuffix") ?? ""
println(skinSuffix) // "_1"