Как сохранить массив строк, используя NSUserDefaults в swift
Я пытаюсь сохранить массив строк, используя NSUserDefaults с swift. Я искал вокруг и считаю, что я должен использовать [NSString] не [String], однако приложение по-прежнему вылетает с ошибкой
фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения
Я не вижу, что я делаю неправильно, так как он работает отлично, сохраняя целые и строковые значения. Вот мой код для моих данных 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()
}
}
}
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
}
Проблема в коде:
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
вместо.