1
votes

Comment définir un tableau d'énumérations dans UserDefaults Swift

J'ai un type de tableau d'énumération personnalisé et je souhaite le stocker dans UserDefaults en utilisant swift4.

enum DataType : Int
{
   case cloud = 1, files = 2, googleDrive = 3, mega = 4, others = 5
}
//
let arrayOfData : [DataType] = [.cloud, .files, .mega]

Je souhaite stocker ce tableau dans UserDefaults.


0 commentaires

3 Réponses :


4
votes

convertissez d'abord votre DataType en rawValue .

enum DataType : Int
{
    case cloud = 1, files = 2, googleDrive = 3, mega = 4, others = 5
}
//
let arrayOfData:[DataType] = [.cloud, .files, .mega]
let rawArrayOfData = arrayOfData.map { $0.rawValue }

UserDefaults.standard.setValue(rawArrayOfData, forKey: "hello")

guard let data = UserDefaults.standard.value(forKey: "hello") as? [DataType.RawValue] else {
    return
}
let saved = data.map{ DataType(rawValue: $0)!}
print(saved)


0 commentaires

0
votes

Stockez les rawValues ​​de DataType . Ensuite, lors de la récupération du tableau de UserDefaults , mappez les valeurs sur DataType

enum DataType: Int {
    case cloud = 1
    case files = 2
    case googleDrive = 3
    case mega = 4
    case others = 5
}

let arrayOfData: [DataType] = [.cloud, .files, .mega]
let arrayKey = "enumArray"

UserDefaults.standard.set(arrayOfData.map { $0.rawValue }, forKey: "enumArray")

let rawArray = UserDefaults.standard.value(forKey: arrayKey) as! [Int]

let dataTypeArray = rawArray.compactMap { DataType(rawValue: $0) }


0 commentaires

7
votes

Rendre DataType conforme à Codable . C'est assez simple, il suffit d'ajouter Codable

do {
    if let data = UserDefaults.standard.data(forKey: "dataType") {
        let array = try JSONDecoder().decode([DataType].self, from: data)
    }
} catch { print(error)}

Maintenant, encodez le tableau en tant que données JSON et enregistrez-le

let data = try! JSONEncoder().encode(arrayOfData)
UserDefaults.standard.set(data, forKey: "dataType")

Et relisez-le en conséquence

enum DataType : Int, Codable
{
    case cloud = 1, files, googleDrive, mega, others // the consecutive raw values are inferred
}

let arrayOfData : [DataType] = [.cloud, .files, .mega]


3 commentaires

Bonne réponse vadian, comme d'habitude, mais j'ai une question. Y a-t-il une raison pour laquelle devrais-je utiliser des codeurs JSON au lieu de codeurs de liste de propriétés ou ici il n'y a pas de différence?


Dans ce cas, JSON est le meilleur choix car il n'a pas de surcharge comme l'en-tête plist et les balises. La liste des propriétés dans UserDefaults n'est utile que si l'objet contient des types que JSON ne prend pas en charge (date et données).


Celui-ci est nouveau je vais essayer ceci et poster ici la solution.