在UserDefaults(Swift)中编码数据时的线程1:EXC_BAD_INSTRUCTION

时间:2017-08-01 05:58:04

标签: swift

enter image description here嗨,我正在尝试在Userdefaults中保存数据,但每当我运行应用程序的这个页面时,我都会收到第1个线程:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOC),如图所示。

在此之前,我在我现在正在获取它的那一行下面的线上得到了同样的错误,但是现在它正在图像中看到的当前行。如何在每次应用启动时保存我的数据?

var highScore = 0
var bronzeStatus = 0

viewDidLoad中:

    let defaults = UserDefaults.standard
    highScore = defaults.value(forKey: "Add1High") as! NSInteger!
    bronzeStatus = defaults.value(forKey: "bronzeMed") as! NSInteger!

下边:

        if correctNumber > highScore {
            highScore = correctNumber
            let defaults = UserDefaults.standard
            defaults.setValue(highScore, forKey: "Add1High")
            defaults.synchronize()
        }


        if highScore >= 15 {
        let defaults = UserDefaults.standard
            let bronzeAlert = UIAlertController(title: "New Medal!", message: "You earned a bronze medal!", preferredStyle: UIAlertControllerStyle.alert)
            bronzeAlert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))

            self.present(scoreAlert, animated: true, completion: nil)
        bronzeStatus = 1
        defaults.setValue(bronzeStatus, forKey: "bronzeMed")
        defaults.synchronize()
        }

3 个答案:

答案 0 :(得分:2)

尝试使用

highScore =  defaults.integer(forKey: "Add1High")

它将返回的值转换为NSInteger。如果值是NSNumber,则返回-integerValue的结果。如果值是NSString,则尽可能将其转换为NSInteger。如果该值不存在或无法转换为整数,则返回0。所以不需要转换你的部分。

同时设置使用

defaults.set(highScore, forKey: "Add1High")

答案 1 :(得分:0)

Swift 3.0代码

  

此代码工作完美..

 var highScore = 0
 var bronzeStatus = 0
  

viewDidLoad中:

        //set integer type data
        UserDefaults.standard.set(20, forKey: "Add1High")
        UserDefaults.standard.set(30, forKey: "bronzeMed")

        //Get integer type data
        let defaults = UserDefaults.standard
        highScore = defaults.integer(forKey: "Add1High")
        bronzeStatus = defaults.integer(forKey: "bronzeMed")

        print("\(highScore)\(bronzeStatus)") //2030

答案 2 :(得分:0)

使用它来检查你的用户默认值是否退出

    let defaults = UserDefaults.standard

    if defaults.value(forKey: "Add1High") != nil{

      highScore = defaults.value(forKey: "Add1High") as! NSInteger!

    }


    if defaults.value(forKey: "bronzeStatus") != nil{

      bronzeStatus = defaults.value(forKey: "bronzeStatus") as! NSInteger!

    }

因为你有条件
       如果correctNumber>高分{}

所以这部分可能会执行,也可能不会执行,因此您必须检查