在展开Optional值时,Swift NSUserDefaults意外地发现了nil

时间:2016-04-22 04:08:49

标签: ios swift nsuserdefaults

//帮助请使用此代码无法正常工作,将此作为Xcode的反馈。 致命错误:在解包可选值时意外发现nil

    var savedScore = NSUserDefaults.standardUserDefaults().objectForKey("HighestScore") as! Int
import SpriteKit

class GameScene: SKScene {

    var highestScore:Int = 2
    var score = Int()

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */

        //To save highest score

        //To get the saved score
        var savedScore = NSUserDefaults.standardUserDefaults().objectForKey("HighestScore") as! Int

        print(savedScore)


    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
       /* Called when a touch begins */
        score += 1
        print("Score - \(score)")

        if score > highestScore
        {
            highestScore = score
            NSUserDefaults.standardUserDefaults().setObject(highestScore, forKey:"HighestScore")
            NSUserDefaults.standardUserDefaults().synchronize()
            print("Beat")
        }

        else {
            print("Not Beat")
        }

    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}

3 个答案:

答案 0 :(得分:1)

您在保存之前调用userDefaults函数。您需要检查它是否存在。首先,您可以让自己更轻松,只需将其保存为整数即可。然后你需要检查是否有值。

NSUserDefaults.standardUserDefaults().setInteger(highestScore, forKey: "HighestScore")

//IntegerForKey will never return nil.  This will return 0 if there is no value.
let savedScore = NSUserDefaults.standardUserDefaults().integerForKey("HighestScore") 
print(savedScore)

答案 1 :(得分:0)

likeBtn.setLongClickable(true); likeBtn.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return true; } }); 是一个字典对象。如果您尝试读取之前未设置值的值,则会得到NSUserDefaults.standardUserDefaults。您可以检查密钥的值是否存在

nil

如果let savedScore = NSUserDefaults.standardUserDefaults.integerForKey("HighestScore") ?? 0 的值存在,您将获得正确的值,否则,您会将HighestScore设置为0的默认值。

答案 2 :(得分:0)

谢谢你们,我昨天得到了它,但是没有时间来到这里并发布它但这里的代码是有效的。再次感谢你们帮助了!

class GameScene: SKScene {

    var score = Int()
    var highScore = Int()

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */


        //IntegerForKey will never return nil.  This will return 0 if there is no value.
        highScore = NSUserDefaults.standardUserDefaults().integerForKey("HighestScore")
        print("highScore - \(highScore)")


    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        /* Called when a touch begins */
        score += 1
        print("Score - \(score)")

        if score > highScore
        {
            highScore = score
            NSUserDefaults.standardUserDefaults().setObject(highScore, forKey:"HighestScore")
            NSUserDefaults.standardUserDefaults().synchronize()
            print("Beat")
        }

        else {
            print("Not Beat")
        }

    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}