将结构数组保存到userDefaults

时间:2019-04-23 16:16:39

标签: ios swift

在我的应用中,我让用户拍摄一件衣服的照片,然后给它添加一个标签来描述它的类型(裤子,衬衫,鞋子等)。然后,我获取此信息并将其保存到结构项中。之后,我将最近制作的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。

2 个答案:

答案 0 :(得分:1)

如@rmaddy评论所说

  

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

无论如何从技术上讲,您要保存自己喜欢的那些,UserDefault不接受这种类型的结构,您需要做的是 将此数组转换为类型Data,然后将其保存到UserDefault中,然后以Data的形式获取,然后将其强制转换回其原始形式,但是同样不建议这样做。

详细了解here

也点击搜索

  

what is user defaults for swift吗?

将给您答案

  

用户默认值为应用程序包中的.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")
    }