将 Set<CustomObject> 存储到 UserDefaults

Posted

技术标签:

【中文标题】将 Set<CustomObject> 存储到 UserDefaults【英文标题】:Storing Set<CustomObject> to UserDefaults 【发布时间】:2019-07-07 08:59:12 【问题描述】:

我有一个自定义类,我将其用作Set&lt;ListItem&gt;。我想将其存储到 userDefaults。但是,我在尝试时收到Attempt to set a non-property-list object as an NSUserDefaults 错误。我尝试将其更改为Array,然后保存它,但仍然是同样的错误。在看到一些帖子后,我也尝试了另存为数据,这又给了我以下错误。

NSForwarding: 警告: 'iTunes_Search_Me.ListItem' 类的对象 0x600003bf9a00 没有实现 methodSignatureForSelector: -- 前面的麻烦

class ListItem: Codable ,Equatable, Hashable 
    let wrapperType, kind: String?
    let artistID, collectionID, trackID: Int?
    let artistName, collectionName, trackName: String?
    let trackViewURL: String?
    let artworkUrl30, artworkUrl60, artworkUrl100: String?
    let releaseDate: String?
    let primaryGenreName: String?
    var isSelected: Bool = false
    enum CodingKeys: String, CodingKey 
        case wrapperType, kind
        case artistID
        case collectionID
        case trackID
        case artistName, collectionName, trackName
        case trackViewURL
        case artworkUrl30, artworkUrl60, artworkUrl100, releaseDate, primaryGenreName
    

    static func ==(lhs: ListItem, rhs: ListItem) -> Bool 
        return lhs.trackID == rhs.trackID
    

    func hash(into hasher: inout Hasher) 
        hasher.combine(trackID)
    

Attempt to set a non-property-list object as an NSUserDefaults

【问题讨论】:

也许使用某种数据库来做这种事情? 这是一种效率较低的解决方法。前任。核心数据。所以只存储一个数组会是一个更好的选择,但我不知道如何解决这个问题。 我的意思是UserDefaults 不是用来存储这种数据的。它适用于用户偏好等。 【参考方案1】:

您可以像这样将模型设置为UserDefaults

首先,您应该创建模型的实例

然后你可以将你的模型保存到UserDefaults:

let encoder = JSONEncoder()
if let encoded = try? encoder.encode(listItemInstance) 
    let defaults = UserDefaults.standard
    defaults.set(encoded, forKey: "ListItemObject")

你可以像这样从UserDefaults获取模型

if let savedItem = defaults.object(forKey: "ListItemObject") as? Data 
    let decoder = JSONDecoder()
    if let loadedItem = try? decoder.decode(ListItem.self, from: savedItem) 
        print(loadedItem)
    

【讨论】:

【参考方案2】:

您可以先尝试设置已保存的数据:

struct saveData
   static let encoded = "encoded"

然后将其保存在该键下:

UserDefaults.standard.set(encoded as! Data, forKey: "encoded")

或尝试将其保存为字符串。

【讨论】:

以上是关于将 Set<CustomObject> 存储到 UserDefaults的主要内容,如果未能解决你的问题,请参考以下文章

如何将 List<CustomObject> 绑定到 WPF DataGrid?

<UUID,CustomObject>的Java排序图[重复]

从 JSONArray 转换为 ArrayList<CustomObject> - Android

在数据表中使用 List<CustomObject> 时出现 NumberFormatException

接受 List<CustomObject> 的 ASP.NET Web 方法因“Web 服务方法名称无效”而失败。

将向量从 c++ dll 重新调整到另一个 c++ exe 时出现问题