Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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
Ios 在展开可选值时意外发现nil_Ios_Swift_Nsuserdefaults - Fatal编程技术网

Ios 在展开可选值时意外发现nil

Ios 在展开可选值时意外发现nil,ios,swift,nsuserdefaults,Ios,Swift,Nsuserdefaults,我对编程非常陌生,几天来我一直在网上寻找,试图解决这个问题,我一直在用我的Swift编程。我对这一切都是陌生的;而且,我已经尽了最大的努力,试图自己找到一个解决办法。但是,在经历了这段令人沮丧的时间后,我认为可以问问专家 我尝试使用的代码如下: import UIKit class ViewController: UIViewController { var myTime: AnyObject = NSUserDefaults() //creates a var called myTi

我对编程非常陌生,几天来我一直在网上寻找,试图解决这个问题,我一直在用我的Swift编程。我对这一切都是陌生的;而且,我已经尽了最大的努力,试图自己找到一个解决办法。但是,在经历了这段令人沮丧的时间后,我认为可以问问专家

我尝试使用的代码如下:

import UIKit
class ViewController: UIViewController {

    var myTime: AnyObject = NSUserDefaults() //creates a var called myTime that can be used to save the time parameter.
    var timer = NSTimer() // creates a variable used by the timer loop.

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        myTime = NSUserDefaults.standardUserDefaults().objectForKey("two")! //sets timer value to last saved value

        if (myTime as NSNumber == 0){ //if the initial value doesnt exhist the if statement creates one.
            NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "two") //sets timer to zero and saves parameter
        }

        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("action"), userInfo: nil, repeats: true) // Creates a timer at 1 second time interval which then performs function called 'action' and will continue until boolean is set to false or NSTimer is invalidated.
    }

    func action(){

        myTime = Int(myTime as NSNumber) + 1 // increases myTime by 1
        println(myTime) //println(time) // prints myTime

        NSUserDefaults.standardUserDefaults().setInteger(myTime as Int, forKey: "two") // saving variable two with value of 2
        NSUserDefaults.standardUserDefaults().synchronize() // Added synchronize as suggested by LAMMERT WESTERHOFF
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
我收到的错误消息如下:

致命错误:在展开可选值时意外发现nil (lldb)

说:

线程1:EXC_BAD_指令(代码=EXC_1386_INVOP,子代码=0x0)

如果有人能告诉我我做错了什么以及如何解决我的问题,我将不胜感激。

错误发生在这里

myTime = NSUserDefaults.standardUserDefaults().objectForKey("two")!
这是因为您试图将可选值(不能为nil)分配给非可选变量

要解决此问题,需要先为键“2”设置对象,然后才能获取此对象或使myTime变量成为可选变量

此外,要检查该值,在将其转换为NSNumber之前,应检查其是否为nil

这段代码应该可以正常工作

*import UIKit
class ViewController: UIViewController {

//here I added ? which means optional value
    var myTime: AnyObject? = NSUserDefaults() //creates a var called myTime that can be used to save the time parameter.
    var timer = NSTimer() // creates a variable used by the timer loop.

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

// here I removed ! because value for key "two" may not been set so it is optional value
        myTime = NSUserDefaults.standardUserDefaults().objectForKey("two") //sets timer value to last saved value

//here we check myTime object for nil before converting to NSInteger and checking for 0
        if ( myTime == nil || myTime as NSNumber == 0){ //if the initial value doesnt exhist the if statement creates one.
            NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "two") //sets timer to zero and saves parameter
        }

        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("action"), userInfo: nil, repeats: true) // Creates a timer at 1 second time interval which then performs function called 'action' and will continue until boolean is set to false or NSTimer is invalidated.
    }

    func action(){

        myTime = Int(myTime as NSNumber) + 1 // increases myTime by 1
        println(myTime) //println(time) // prints myTime

        NSUserDefaults.standardUserDefaults().setInteger(myTime as Int, forKey: "two") // saving variable two with value of 2
        NSUserDefaults.standardUserDefaults().synchronize() // Added synchronize as suggested by LAMMERT WESTERHOFF
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}*

您不会说哪一行给了您错误,但是考虑到您第一次运行代码时,用户默认中没有条目。这让我觉得问题出在
.objectForKey(“两个”)。你不能保证会有这样一个物体。谢谢你对谢尔盖的巨大帮助。它完全解决了我的问题。