在我的应用中,我让用户拍摄一件衣服的照片,然后给它添加一个标签来描述它的类型(裤子,衬衫,鞋子等)。然后,我获取此信息并将其保存到结构项中。之后,我将最近制作的Item放入Items数组中。我正在努力将这一系列的项目保存到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 && 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
}
这是我从UserDefaults加载itemArray的地方:
override func viewDidLoad() {
super.viewDidLoad()
// let defaults = UserDefaults.standard
// let array = defaults.array(forKey: "SavedItemArray") as? [Item] ?? [Item]()
// itemsArray = array
}
希望能够将Item数组保存并加载到UserDefaults。
答案 0 :(得分:1)
如@rmaddy评论所说
不建议将这类数据保存到
UserDefault
无论如何从技术上讲,您要保存自己喜欢的那些,UserDefault
不接受这种类型的结构,您需要做的是
将此数组转换为类型Data
,然后将其保存到UserDefault
中,然后以Data
的形式获取,然后将其强制转换回其原始形式,但是同样不建议这样做。
详细了解here。
也点击搜索
将给您答案
用户默认值为应用程序包中的
.plist
文件,您可以使用它来设置和获取简单数据。它的结构与字典非常相似,并且用户默认值通常被视为键值存储。
答案 1 :(得分: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")
}