使用 UserDefault 快速存储和检索数组数据

Posted

技术标签:

【中文标题】使用 UserDefault 快速存储和检索数组数据【英文标题】:Swift store and retrieve array data using UserDefault 【发布时间】:2019-11-06 07:28:05 【问题描述】:

在我的场景中,我需要将 array 值存储到 UserDefault 并检索相同的数据。当用户再次打开特定的viewcontroller时,检索数据需要加载到同一个数组中。下面是我正在尝试的代码。我不知道如何以正确的方式将数组输出值下方的 storeretrieve 放入 UserDefaults 中。请帮我解决这个问题。

将数据存储到数组中

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        self.tableView.deselectRow(at: indexPath, animated: true)
        let item = searching ? filteredData[indexPath.row] : membersData[indexPath.row]

        if let cell = tableView.cellForRow(at: indexPath) 
            if cell.accessoryType == .checkmark 
                cell.accessoryType = .none

                // UnCheckmark cell JSON data Remove from array
                self.selectedRows = selectedRows.filter$0 != indexPath.row
                self.selectedValues.remove(item) // Here Data Removing Into Array

             else 
                cell.accessoryType = .checkmark

                // Checkmark selected data Insert into array
                self.selectedRows.append(indexPath.row) //select
                self.selectedValues.insert(item) // Here Data Storing Into Array
            
                
    

将数组数据保存到 UserDefault

@IBAction func doneAction(_ sender: Any) 

        // Selected Row Index Store
        UserDefaults.standard.set(selectedRows, forKey: "SelectedIndexes")
        // Here need to store Selected values
        self.dismiss(animated: true, completion: nil)
    

将 UserDefault 存储的数据重新加载到同一个数组中 (viewDidLoad)

    self.selectedRows = UserDefaults.standard.value(forKey: "SelectedIndexes") as? [Int] ?? []
// Here how to retrieve SelectionValue and Load into `selectedValues` array

可编码

// MARK: - ListData
struct ListData: Codable, Hashable 
    let userid: String?
    let firstname, designation: String?
    let profileimage: String?
    var isSelected = false

    private enum CodingKeys : String, CodingKey 
        case userid, firstname, designation, profileimage
    

数组数据

SELECT VALUE:[ListData(userid: Optional("1"), firstname: 可选(“abc”),名称:可选(“English”),个人资料: 可选(“url”)),ListData(用户ID: 可选(“2”),名字:可选(“def”),名称: 可选(“数字”),profileimage: 可选(“url”))] 选择行:[0, 1]

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 @PGDev 搜索后的搜索结果复选标记无法正常工作,但没有搜索复选标记工作正常。 【参考方案1】:

如果您想存储在 UserDefault 中,虽然不建议这样做。

var selectedValues: [Any] = [["id": 1, "name": "Adam"]]
selectedValues.append(["id": 2, "name": "Eve"])
UserDefaults.standard.set(selectedValues, forKey: "SelectedValues")
let result = UserDefaults.standard.array(forKey: "SelectedValues") ?? []

print(result)


Output : [
  id = 1;
  name = Adam;
, 
  id = 2;
  name = Eve;
]

【讨论】:

为什么是AnyObject?所有值都是值类型。为什么value(forKey?有array(forKey @vadian 是的,你是对的。我已经更新了代码,你可以看看告诉我它是否有效。【参考方案2】:

如果要在 UserDefaults 中保存列表,则只能在 UserDefaults 中使用Any 数据类型列表。首先,您应该将所选行保存在 Any 数据类型列表中。第 1 步: 将列表声明为 Any 数据类型并在其中附加所选行数据。

var selectedValues: [Any]?

第 2 步:在单独的类中创建一个变量,您的所有 UserDefaults 都将存储 Any 数据类型列表保存在

//MARK: store selectedValues

private let KeySelectedValues = "KeySelectedIndexes"
fileprivate var _selectedValueList = [Any]()

var selectedValueList : [Any] 
    get 
        _selectedValueList = UserDefaults.standard.object(forKey: KeySelectedIndexes) as? [Any] ?? _selectedValueList
        return _selectedValueList
    

    set 
        _selectedValueList = newValue
        UserDefaults.standard.set(_selectedValueList, forKey: KeySelectedIndexes)
    


第 3 步: 将列表保存在 UserDefaults 中,如

classObj.selectedValueList = selectedValues

第 4 步:从 UserDefaults 中检索数据列表

let _selectedValueList = classObj.selectedValueList   
guard let selectedValueList:[YourSelectedRowModel] = Mapper<YourSelectedRowModel>().mapArray(JSONArray: _selectedValueList as! [[String : Any]]) else 
     return

【讨论】:

UserDefaults 中只能Any 数据类型列表 错了。您可以将所有符合属性列表的同质类型保存为 UserDefaults 中的数组([String][Int][Double][Bool][Date][Data])。 @vadian 我说的是任何数据类型列表。您不能保存任何其他模型类型列表。 数据类型列表是什么意思?代码显示了一个数组。您可以保存 [Int]selectedRows 实际代表的),但如果您要保存不符合属性列表的类型,您的代码将会崩溃。 selectedRows 是一个列表或数组,其数据类型是一个模型,包含多个类型变量,如 int、string、bool 等。您可以将相同数据类型的数组保存为 [Int]、[String] 但不能[你的模型类型]。所以我的意思是如果你想在 UserDefault 中保存模型类型列表或数组,你可以在我的代码的帮助下保存。 不,问题中的selectedRows 显然是[Int]

以上是关于使用 UserDefault 快速存储和检索数组数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 类中检索目标 C 类中的 Userdefault?

如何在swift中将json数组保存和检索到用户默认值?

JSON .count 数组在 Swift 4 中总是返回 0

将值附加到数据数组并保存在 Userdefault swift

LeetCode0001.两数之和

我的 Userdefault 没有保存数据,也没有被 ObjectMapper 快速映射