Swift 从singleton获取可选字符串
我创建了一个包含一些变量和let的类。其中一个变量是Swift 从singleton获取可选字符串,swift,string,singleton,nsuserdefaults,optional,Swift,String,Singleton,Nsuserdefaults,Optional,我创建了一个包含一些变量和let的类。其中一个变量是字符串。我将它们存储在UserDefaults中。如果我想通过单例类访问这个类的字符串,我总是会得到一个可选字符串。我不知道为什么 以下是对象的类: import Foundation import SpriteKit class BallSkinsClass: NSObject, NSCoding { let id: Int var name: String var isBuyed: Bool let ID
字符串
。我将它们存储在UserDefaults
中。如果我想通过单例类访问这个类的字符串,我总是会得到一个可选字符串。我不知道为什么
以下是对象的类:
import Foundation
import SpriteKit
class BallSkinsClass: NSObject, NSCoding {
let id: Int
var name: String
var isBuyed: Bool
let ID = "id"
let NAME = "name"
let ISBUYED = "isBuyed"
init(id: Int, name: String, isBuyed: Bool) {
self.id = id
self.name = name
self.isBuyed = isBuyed
}
required init?(coder aDecoder: NSCoder) {
self.id = aDecoder.decodeInteger(forKey: ID)
self.name = String(describing: aDecoder.decodeObject(forKey: NAME))
self.isBuyed = aDecoder.decodeBool(forKey: ISBUYED)
}
@objc func encode(with aCoder: NSCoder) {
aCoder.encode(id, forKey: ID)
aCoder.encode(name, forKey: NAME)
aCoder.encode(isBuyed, forKey: ISBUYED)
}
}
要声明皮肤、访问、保存和加载,我的BallSkinsClass中有以下函数:
import Foundation
import SpriteKit
import GameKit
class BallSkins {
static var sharedInstance = BallSkins()
private init() {
}
let BALLSKINS = "ballSkins"
var standard: BallSkinsClass! = BallSkinsClass(id: 0, name: "Standard", isBuyed: true)
var billiard: BallSkinsClass! = BallSkinsClass(id: 1, name: "Billard", isBuyed: false)
var emoji: BallSkinsClass! = BallSkinsClass(id: 2, name: "Emojis", isBuyed: false)
func archiveBallSkins(ballSkins:[BallSkinsClass]) -> NSData {
print("archiving Skins")
let archivedBallSkins = NSKeyedArchiver.archivedData(withRootObject: ballSkins as Array)
return archivedBallSkins as NSData
}
func saveBallSkins(ballSkins:[BallSkinsClass]) {
let archivedBallSkins = archiveBallSkins(ballSkins: ballSkins)
UserDefaults.standard.set(archivedBallSkins, forKey: BALLSKINS)
print("saving Skins")
}
func retrieveBallSkins() -> [BallSkinsClass]? {
print("retrieving Skins")
if let unarchivedBallSkins = UserDefaults.standard.object(forKey: BALLSKINS) as? NSData {
return NSKeyedUnarchiver.unarchiveObject(with: unarchivedBallSkins as Data) as? [BallSkinsClass]
}
return nil
}
func loadBallSkins() {
print("loading Skins")
let archivedBallSkins = retrieveBallSkins()
for ballSkin in archivedBallSkins! {
switch ballSkin.id {
case 0 :
standard.isBuyed = ballSkin.isBuyed
case 1:
billiard.isBuyed = ballSkin.isBuyed
case 2:
emoji.isBuyed = ballSkin.isBuyed
default:
standard.isBuyed = ballSkin.isBuyed
}
}
}
}
如果要访问任何其他场景或视图中的蒙皮名称,请调用:
ballSkins.sharedInstance.billiard.name
但每次都是可选的!我不知道错误的原因和位置。我想这是由
required init?(coder aDecoder: NSCoder) {
self.id = aDecoder.decodeInteger(forKey: ID)
self.name = String(describing: aDecoder.decodeObject(forKey: NAME))
self.isBuyed = aDecoder.decodeBool(forKey: ISBUYED)
}
第三行生成可选字符串,因为根据文档
func decodeObject()->有吗
字符串(描述:…)不会打开您的值。您必须自己从UserDefaults中打开所有值,如果不可能为零,则提供defaultValue您创建标准和其他标准的方式是错误的。
name=aDecoder.decodeObject(forKey:“name”)as?一串“
@el西红柿:你能告诉我为什么吗?也许能给我一个提示,告诉我怎样才能做得更好,那就太好了!谢谢你的回答!现在工作!