2015-07-23 3 views
1

Я пытаюсь сохранить строковый массив, используя NSUserDefaults с быстрым. Я искал вокруг и считаю, что я должен использовать [NSString] не [String], однако приложение по-прежнему падает с ошибкойКак сохранить массив строк с помощью NSUserDefaults в swift

fatal error: unexpectedly found nil while unwrapping an Optional value

Я не могу видеть, что я делаю не так, как это работает прекрасно Интс экономии и строки. Вот мой код для моих данных singleton и NSUserDefaults.

struct DefaultsKeys 
{ 
    static let myString = "myString" 
    static let myInt = "myInt" 
    static let myArray = "myArray" 

} 



class DataContainerSingleton 
{ 
    static let sharedDataContainer = DataContainerSingleton() 


    var myString: String? 
    var myInt: Int? 
    var myArray:[NSString]? 

/* I have also tried: 
    var myArray:[NSString] = [NSString]() */ 



    var goToBackgroundObserver: AnyObject? 

    init() 
    { 
    let defaults = NSUserDefaults.standardUserDefaults() 


    myString = defaults.objectForKey(DefaultsKeys.myString) as! String? 
    myInt = defaults.objectForKey(DefaultsKeys.myInt) as! Int? 
    myArray = defaults.objectForKey(DefaultsKeys.myArray) as! [NSString]? 



    goToBackgroundObserver = NSNotificationCenter.defaultCenter().addObserverForName(
     UIApplicationDidEnterBackgroundNotification, 
     object: nil, 
     queue: nil) 
     { 
     (note: NSNotification!) -> Void in 
     let defaults = NSUserDefaults.standardUserDefaults() 

     defaults.setObject(self.myString, forKey: DefaultsKeys.my) 
     defaults.setObject(self.myInt, forKey: DefaultsKeys.myInt) 
     defaults.setObject(self.myArray, forKey: DefaultsKeys.myArray) 


     defaults.synchronize() 
    } 
    } 
} 
+0

На какой линии происходит ошибка? – jtbandes

+0

Хорошо. Поэтому я думаю, что проблема заключается не в реализации NSUserDefaults, а в доступе к значениям в другом месте приложения. Это сделало бы мою жизнь намного легче, если бы я мог инициализировать массив в контейнере данных, а не делать его необязательным. Есть ли способ сделать эту работу? – Matt

ответ

1

Проблема код:

myString = defaults.objectForKey(DefaultsKeys.myInt) as! String? 
myInt = defaults.objectForKey(DefaultsKeys.myInt) as! Int? 
myArray = defaults.objectForKey(DefaultsKeys.myArray) as! [NSString]? 

as! означает развертке дополнительную ценность, поэтому ваше приложение разбился с ошибкой

fatal error: unexpectedly found nil while unwrapping an Optional value 

если defaults.objectForKey(DefaultsKeys.myInt) равен нулю, то разворачивая ноль не позволил. Вы должны использовать

myString = defaults.objectForKey(DefaultsKeys.myInt) as? String 

вместо этого.

+0

Я попытался инициализировать массив, как показано в моем коде, который прокомментирован ниже объявления свойств, но он говорит, что я должен использовать как! конвертировать любой объект? на [NSString]. Я запутался, так как я объявил его как тип [NSString] и был инициализирован как [NSString](). Любая идея, что происходит? – Matt

+0

Если вы объявите свойство как необязательные, вы должны использовать 'as!'. –

+0

Хорошо, поэтому ive удалось заставить его работать, оставив его как необязательный и добавив кучу значений в мой код. – Matt

2
 <!-- language: swift --> 

     //declare and initiate the array   
     var sample_array : NSMutableArray! = [] 
     //use mutable array to add data 

     //variable to store value in array 
     var say: String! = "Hello" 

     //add values in array 
     sample_array.addObject("hello") 
     //or 
     //sample_array.addObject(say) 

     /* 
     //you can also save values in array like this 
     var sample_array: Array<String> = [] 
     var say: String! = "Hello" 
     sample_array = ["Qwerty"] 
     sample_array.insert(say, atIndex: 1) 
     println(sample_array) 
     */ 

     //archive and saving data 
     let data = NSKeyedArchiver.archivedDataWithRootObject(sample_array) 
     NSUserDefaults.standardUserDefaults().setObject(data, forKey: "array_key") 
     NSUserDefaults.standardUserDefaults().synchronize() 

     //unarchive and getting data 
     if let data = NSUserDefaults.standardUserDefaults().objectForKey("array_key") as? NSData { 
     stopover_array = NSKeyedUnarchiver.unarchiveObjectWithData(data) as NSMutableArray 
      } 
Смежные вопросы