Сохранение массива структур в UserDefaults

#ios #swift

#iOS #swift

Вопрос:

В моем приложении я прошу пользователя сфотографировать предмет одежды, а затем присвоить ему тег, описывающий, какого он типа (брюки, рубашка, обувь и т.д.). Затем я беру эту информацию и сохраняю ее в элементе структуры. После этого я помещаю недавно созданный элемент в массив элементов. Я пытаюсь понять, как сохранить этот массив элементов в UserDefaults, чтобы я мог загружать обратно, когда приложение закрыто.

Я попытался добавить Codable в свою структуру, но это только вызвало больше проблем. Я хотел обновлять UserDefaults каждый раз, когда пользователь добавляет новый элемент в массив. Я планирую сделать это в saveItemButton функции (показано ниже).

 var itemsArray: [Item] = []

//.pants, .shirt, .shoes, .hat, .extra, .jacket
var itemType: clothingType? = nil

@IBAction func saveItemButton(_ sender: Any) {
    if(itemType != nil amp;amp; imageView.image != nil){
        saveImage(imageName: ("item"   "(itemsArray.count)"))
        let item = Item(itemType: itemType!, itemName: ("item"   "(itemsArray.count)"))


        itemsArray.append(item)

        //let defaults = UserDefaults.standard
        //defaults.set(itemsArray, forKey: "SavedItemArray")
    }
}
  

Вот моя структура в отдельном файле swift:

 import Foundation
import UIKit


struct Item{
    var itemType: clothingType
    var itemName: String
    //var itemImage: UIImage?
}

enum clothingType{
    case pants
    case shirt
    case jacket
    case shoes
    case hat
    case extra
}
  

И вот где я бы загрузил itemArray из UserDefaults:

 override func viewDidLoad() {
    super.viewDidLoad()
    //        let defaults = UserDefaults.standard
    //        let array = defaults.array(forKey: "SavedItemArray")  as? [Item] ?? [Item]()
    //        itemsArray = array
}
  

Хотите иметь возможность сохранять и загружать массив элементов в UserDefaults.

Комментарии:

1. Не храните данные вашего приложения в UserDefaults. Лучшим вариантом является кодирование ваших данных и сохранение их в plist.

2. @rmaddy Почему это лучше? Это моральное суждение или есть техническая проблема?

3. UserDefaults предназначен для хранения небольших фрагментов информации, таких как настройки и предпочтения. Он не предназначен для хранения больших объемов данных.

4. в соответствии с соглашением об именовании Swift перечисления начинаются с заглавной буквы

5. @rmaddy UserDefaults является списком. Какая разница, читаем ли мы / записываем из него или из файла? Откуда вы берете это требование «маленьких битов»?

Ответ №1:

Вот так:

 struct Item : Codable {
    var itemType: clothingType
    var itemName: String
}

enum clothingType : String, Codable {
    case pants
    case shirt
    case jacket
    case shoes
    case hat
    case extra
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let defaults = UserDefaults.standard
        if let data = defaults.data(forKey: "SavedItemArray") {
            let array = try! PropertyListDecoder().decode([Item].self, from: data)
        }
    }
}
  

Конечно, я полагаю, теперь вам интересно, как мы вообще ввели данные в пользовательские значения по умолчанию. Вот так:

     let array : [Item] = // whatever
    if let data = try? PropertyListEncoder().encode(array) {
        UserDefaults.standard.set(data, forKey: "SavedItemArray")
    }
  

Комментарии:

1. Это решило мою проблему! Отвечая на @rmaddy и ваши дебаты, я также слышал, что не следует использовать UserDefaults, но это для класса разработки мобильных приложений, и нам еще предстоит узнать, как сохранять постоянные данные любым другим способом, поэтому я не хотел делать то, чему я не научился. Спасибо!

Ответ №2:

Как говорится в комментарии @rmaddy

Сохранение такого рода данных в UserDefault не рекомендуется

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

Подробнее об этом читайте здесь.

Также нажимаем поиск по этому

что такое пользовательские значения по умолчанию для swift?

Даст вам ответ на этот

Пользовательские значения по умолчанию — это .plist файл в пакете вашего приложения, и вы можете использовать его для установки и получения простых фрагментов данных. Его структура очень похожа на структуру словаря, и пользовательские значения по умолчанию часто рассматриваются как хранилище значений ключа.