Как хранить и извлекать данные в userdefault? (Пример: массив структур) - PullRequest
0 голосов
/ 21 мая 2019
struct ExpandableNames:Codable {
    var isExpanded: Bool
    var names: [String]
    var icons: [String]
} 

var names = ["Food/Drink", "Tours", "Transport", "Gifts","Flights", "Shopping", "Activities","Entertainment","Accomodation","Other"]
var icons = ["Food_Category", "Tours", "Transport_Category", "Gifts_Category","Flights_Category","Shopping_Category","Activities_category","Entertainment_category", "Accomodation_Category","Other_Category"]

var categoryWholeArray = [Int:ExpandableNames]()

Как сохранить categoryWholeArray по умолчанию для пользователя?

Я пытался

Store userDefault:

 UserDefaults.standard.set(try? PropertyListEncoder().encode(categoryWholeArray), forKey:"categoryWholeArray")

Проблема получения данных здесь

   if let data = UserDefaults.standard.value(forKey:"categoryWholeArray") as? Data {
                      let songs2 = try? PropertyListDecoder().decode(Array<categoryWholeArray.values>.self, from: data)
}

Кто-нибудь пробовал?

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вам нужно encode данных при хранении в UserDefaults, а когда вы пытаетесь получить эти данные, вам необходимо decode их.

Вот extension у меня есть что может помочь вам.

extension UserDefaults {

    func setCustomObjToUserDefaults(CustomeObj: AnyObject, forKey:String) {
        let defaults = UserDefaults.standard
        let encodedData = NSKeyedArchiver.archivedData(withRootObject: CustomeObj)
        defaults.set(encodedData, forKey: forKey)
        defaults.synchronize()
    }

    func getCustomObjFromUserDefaults(forKey:String) -> AnyObject? {
        let defaults = UserDefaults.standard
        if defaults.object(forKey: forKey) != nil {
            if let decoded  = defaults.object(forKey: forKey) as? Data {
                let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with:decoded) as AnyObject
                return decodedTeams
            }
        }
        return nil
    }

    func setJsonObject<T: Encodable>(encodable: T, forKey key: String) {
        if let data = try? JSONEncoder().encode(encodable) {
            set(data, forKey: key)
        }
    }

    func getJsonObject<T: Decodable>(_ type: T.Type, forKey key: String) -> T? {
        if let data = object(forKey: key) as? Data,
            let value = try? JSONDecoder().decode(type, from: data) {
            return value
        }
        return nil
    }

    func removeCustomObject(forKey:String)
    {
        let defaults = UserDefaults.standard
        defaults.removeObject(forKey: forKey)
        defaults.synchronize()
    }

}
0 голосов
/ 21 мая 2019

Все правильно, кроме

if let data = UserDefaults.standard.value(forKey:"categoryWholeArray") as? Data {
    let songs2 = try? PropertyListDecoder().decode([Int:ExpandableNames].self, from: data)
    print(songs2)
}
...