#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
, а затем верните его в исходную форму, но опять же это не рекомендуется.
Подробнее об этом читайте здесь.
Также нажимаем поиск по этому
Даст вам ответ на этот
Пользовательские значения по умолчанию — это
.plist
файл в пакете вашего приложения, и вы можете использовать его для установки и получения простых фрагментов данных. Его структура очень похожа на структуру словаря, и пользовательские значения по умолчанию часто рассматриваются как хранилище значений ключа.