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.
3 Réponses :
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)
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) }
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]
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.