Сохранение Set <CustomObject>в UserDefaults - PullRequest
0 голосов
/ 07 июля 2019

У меня есть пользовательский класс, который я использую как Set<ListItem>.Я хочу сохранить это в userDefaults.Тем не менее, я получаю Attempt to set a non-property-list object as an NSUserDefaults ошибка при попытке.Я попытался изменить его на Array, а затем сохранить его, но ошибка все та же.Я также попытался сохранить как данные после того, как увидел некоторые сообщения, опять же это выдает мне ошибку ниже.

NSForwarding: предупреждение: объект 0x600003bf9a00 класса 'iTunes_Search_Me.ListItem' не реализует 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)
    }
}

Попытка установить объект списка не-свойств как NSUserDefaults

Ответы [ 2 ]

3 голосов
/ 07 июля 2019

Вы можете установить модель на 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)
        }
    }
    
0 голосов
/ 07 июля 2019

Вы можете сначала попытаться настроить сохраненные данные:

struct saveData{
   static let encoded = "encoded"
}

Затем сохранить их под этим ключом:

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

или попробовать вместо этого сохранить их как строку.

...