2014-12-29 7 views
1

Я очень новичок в программировании, и сейчас я ищу в Интернете несколько дней, пытаясь решить эту проблему, которую я имел с моим программированием 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. 
    } 
} 

Сообщение об ошибке я получаю это:

fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

говоря:

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)

Я бы искренне оцениваю это, если кто-то может сказать мне, что я делаю неправильно, и как решить мою проблему.

+0

вы не говорите, какая линия дает вам ошибку, но считают, что первый раз, когда вы запустите код не будет никаких записей в значения по умолчанию пользователя. Это заставляет меня думать, что проблема заключается в '.objectForKey (« two »)!'. Вы не можете гарантировать, что будет такой объект. –

ответ

2

Ошибка возникает здесь

myTime = NSUserDefaults.standardUserDefaults().objectForKey("two")! 

это потому, что вы пытаетесь присвоить дополнительное значение, которое не может быть нулевым, к, не необязательной переменной.

для решения этой проблемы необходимо установить объект для ключа «два», прежде чем будет получать этот объект или сделать Mytime переменного дополнительного

также проверить значение, которое вы должны проверить его на ноль перед преобразованием его в NSNumber

этот код должен работать нормально

*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. 
    } 
}* 
+0

Спасибо за огромную помощь Сергея. Это полностью устранило мою проблему. –