繁体   English   中英

将结构数组保存到userDefaults

[英]Saving an array of structs to userDefaults

在我的应用程序中,我让用户为一件衣服拍照,然后给它添加一个标签来描述它是什么类型(裤子,衬衫,鞋子等)。 然后,我获取此信息并将其保存到结构项中。 之后,我将最近制作的Item放入Items数组中。 我在如何将此项目数组保存到UserDefaults上感到挣扎,以便在应用程序关闭时可以重新加载。

我尝试将Codable添加到我的结构中,但这带来了更多问题。 每当用户向阵列中添加新项目时,我都想更新UserDefaults。 我计划在saveItemButton函数中执行此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。

像这样:

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")
    }

正如@rmaddy评论所说

不建议将这类数据保存到UserDefault

但是从技术上说,您要保存那些您喜欢的东西, UserDefault不接受这种类型的结构,您需要做的是将该数组转换为Data类型,将其保存到UserDefault ,然后将其提取为Data然后进行转换回到其原始形式,但再次不建议这样做。

在此处了解更多信息。

也点击搜索

swift的用户默认设置是什么?

会给你答案

用户默认值为应用程序包中的.plist文件,您可以使用它来设置和获取简单的数据 它的结构与字典非常相似,并且用户默认值通常被视为键值存储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM