(Swift) хранение и извлечение массива в NSUserDefaults

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

В настоящее время я использую:

//store data
NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "(identity.text!)listA")                    
NSUserDefaults.standardUserDefaults().synchronize()

//retrieve data
let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("(identity.text!)listA")
myArray = [tabledata!]
tableView.reloadData()

но я

фатальная ошибка: неожиданно обнаружил nil при разворачивании необязательное значение

при попытке загрузить данные. Я не уверен, находится ли проблема в хранилище или извлечении. Кто-нибудь проходил через это раньше?

7 ответов


из вашего кода я вижу, что вы храните некоторый массив

// Your code
NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "\(identity.text!)listA")

и получение строки

//Your code
let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA")

вероятно, существует несоответствие типов, вы сохраняете один тип и извлекаете другой тип.

при получении либо использовать arrayForKey() или objectForKey() см. код ниже.

let tabledata = NSUserDefaults.standardUserDefaults().arrayForKey("\(identity.text!)listA") 

или

let tabledata = NSUserDefaults.standardUserDefaults().objectForKey("\(identity.text!)listA")

если это массив, я бы пошел с первым.


вот как вы можете хранить и извлекать массив объекта с помощью NSKeyArchive.

для хранения массива в NSUserDefault.

let placesData = NSKeyedArchiver.archivedData(withRootObject: placesArray)
UserDefaults.standard.set(placesData, forKey: "places")

для извлечения массива из NSUserDefault.

let placesData = UserDefaults.standard.object(forKey: "places") as? NSData

if let placesData = placesData {
    let placesArray = NSKeyedUnarchiver.unarchiveObject(with: placesData as Data) as? [Place]
    print(placesArray)
}

надеюсь, это поможет вам.


Я пришел к этому вопросу, глядя, как сохранить массив строк в UserDefaults, но не нашел четкого ответа здесь. Тем не менее, я нашел ответ в как сохранить настройки пользователя с помощью NSUserDefaults. Прочтите эту статью для получения дополнительной информации.

сохранение и извлечение массива строк в UserDefaults

сохранить массив

let array = ["horse", "cow", "camel", "sheep", "goat"]

let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")

извлечь массив

let defaults = UserDefaults.standard
let array = defaults.object(forKey: "SavedStringArray") as? [String] ?? [String]()

что вы храните в массиве?

Если это объекты, это не будет работать, если это просто строки или числа, то это должно быть хорошо.

следующие шаги, которые вы делаете, должны включать точки останова исключений и, возможно, println() все, что вы можете, чтобы вы могли точно определить местонахождение проблемы.

в качестве выстрела в темноте я бы предложил, возможно (идентичность.смс!) выходит как nil

также вы, вероятно, должны изменить его на это

if let tabledata: NSArray = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA"){

    myArray = [tabledata!]

    tableView.reloadData()
}

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


последняя версия swift3 для хранения массива данных в userdefaults и получить этот массив данных с помощью ключей

    let nameArray = ["Ramu","JAGAN","Steve","Swift"]
    let namesArrayData = NSKeyedArchiver.archivedData(withRootObject: nameArray)
    UserDefaults.standard.set(namesArrayData, forKey: "arrayData")

RetriveData

        let retriveArrayData= UserDefaults.standard.object(forKey:  "arrayData") as? NSData

   if let retriveArrayData= namesArrayData{
  let retriveArray = NSKeyedUnarchiver.unarchiveObject(with: namesArraydata as Data) as? [nameArray]
  print(retriveArray )
}

Это было изменено в swift 3. Обратите внимание, что это работает с устройством, но не игровой площадкой или симулятором

//store the array
let array = ["horse", "cow", "camel", "sheep", "goat"]

let defaults = UserDefaults.standard

defaults.setValue(array, forKey: "history")

defaults.synchronize()

//Retrieve the array
if((UserDefaults.standard.array(forKey: "history")) != nil){
    let historyWords = (UserDefaults.standard.array(forKey: "history") as? [String])!
    print(historyWords)
}

Store в Пользователя по умолчанию:

let arrayFruit = ["Apple","Banana","Orange","Grapes","Watermelon"]    
 //store in user default
UserDefaults.standard.set(arrayFruit, forKey: "arrayFruit")

извлечение массива из пользовательских значений по умолчанию:

if let arr = UserDefaults.standard.array(forKey: "arrayFruit") as? [String]{
    print(arr)
}