Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 从singleton获取可选字符串_Swift_String_Singleton_Nsuserdefaults_Optional - Fatal编程技术网

Swift 从singleton获取可选字符串

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

我创建了一个包含一些变量和let的类。其中一个变量是
字符串
。我将它们存储在
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西红柿:你能告诉我为什么吗?也许能给我一个提示,告诉我怎样才能做得更好,那就太好了!谢谢你的回答!现在工作!