简体   繁体   English

收纳套装<CustomObject>到用户默认值

[英]Storing Set<CustomObject> to UserDefaults

I have a custom class which I use as Set<ListItem> .我有一个自定义类,用作Set<ListItem> I want to store this to userDefaults.我想将其存储到 userDefaults。 However, I'm getting Attempt to set a non-property-list object as an NSUserDefaults error when trying to.但是,我在Attempt to set a non-property-list object as an NSUserDefaults错误。 I tried to change it to Array and then save it but still same error.我尝试将其更改为Array然后保存它,但仍然出现相同的错误。 I also tried Saving as data after saw some posts, again this gives me below error.在看到一些帖子后,我也尝试保存为数据,这再次给了我以下错误。

NSForwarding: warning: object 0x600003bf9a00 of class 'iTunes_Search_Me.ListItem' does not implement methodSignatureForSelector: -- trouble ahead 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 尝试将非属性列表对象设置为 NSUserDefaults

You can set the model to UserDefaults like this:您可以将模型设置为UserDefaults如下所示:

  • Firstly you should create an instance of your model首先,您应该创建模型的实例

  • And then you can save your model to UserDefaults :然后您可以将模型保存到UserDefaults

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

    You can get model from UserDefaults like this您可以像这样从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) } }

You could try first setting up saved data:您可以尝试先设置保存的数据:

struct saveData{
   static let encoded = "encoded"
}

Then save it under that key:然后将其保存在该键下:

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

or try saving it as a string instead.或尝试将其另存为字符串。

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

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