2017-03-14 1 views
1

J'ai une classe Struct personnalisée pour contenir les calories, les graisses, les glucides et les protéines.STRUCT Array To UserDefaults

Chaque fois qu'un utilisateur entre les données que je mets dans une variable

var theArray : NSMutableArray = [] 

struct CFCPstruct { 
    let calories : Int! 
    let fats : Int! 
    let carbs : Int! 
    let protein: Int! 
    init(Calories: Int, Fats: Int, Carbs: Int, Protein: Int) { 
     self.calories = Calories 
     self.fats = Fats 
     self.carbs = Carbs 
     self.protein = Protein 
    } 
} 

let addLog = [CFCPstruct(Calories: totalCalories, Fats: totalFats, Carbs: totalCarbs, Protein: totalProtein)] 

Maintenant, je crée aussi un tableau pour stocker tout. J'ai ensuite besoin de stocker toutes les valeurs dans le tableau, qui stockent ensuite à UserDefaults.

Ensuite, je dois appeler l'utilisateur par défaut tableau appel [0] permet de dire et appeler chaque calorie, glucides, ... quelque chose comme thelog.calories // theology.carbs etc

Répondre

2

Pour pouvoir utilisez NSCoding l'objet doit être une classe. Mais comme toutes les valeurs sont conformes à la liste des propriétés, vous pouvez ajouter une variable dictionaryRepresentation et un initialiseur correspondant.

d'abord jamais utilisation NSMutableArray à Swift et jamais déclarer des variables comme option non emballés implicites qui sont initialisés avec un initialiseur non en option.

var theArray = [CFCPstruct]() 

struct CFCPstruct { 
    let calories : Int 
    let fats : Int 
    let carbs : Int 
    let protein: Int 

    init(calories: Int, fats: Int, carbs: Int, protein: Int) { 
     self.calories = calories 
     self.fats = fats 
     self.carbs = carbs 
     self.protein = protein 
    } 

    init(dictionary : [String:Int]) { 
     self.calories = dictionary["calories"]! 
     self.fats = dictionary["fats"]! 
     self.carbs = dictionary["carbs"]! 
     self.protein = dictionary["protein"]! 
    } 

    var dictionaryRepresentation : [String:Int] { 
     return ["calories" : calories, "fats" : fats, "carbs" : carbs, "protein" : protein] 
    } 
} 

Maintenant, vous pouvez lire le tableau et écrire aux valeurs par défaut de l'utilisateur.

func saveDefaults() 
{ 
    let cfcpArray = theArray.map{ $0.dictionaryRepresentation } 
    UserDefaults.standard.set(cfcpArray, forKey: "cfcpArray") 
} 

func loadDefaults() 
{ 
    theArray = (UserDefaults.standard.object(forKey: "cfcpArray") as! [[String:Int]]).map{ CFCPstruct(dictionary:$0) } 
} 
-1

Maintenant, si vous avez créé un tableau de vos données, vous pouvez l'enregistrer comme suit: -

laisser yourArrayOfDict = [[ "a": "Smith", "b": "UK"], [ "a": "Paul", "b": "EAU"]]

Swift 3:

let defaults = UserDefaults.standard 
defaults.set(yourArrayOfDict, forKey: "customKey_SavedArray") 

Maintenant, vous les accès par:

let s = defaults.value(forKey: "customKey_SavedArray") 
print(s) 

Vous obtiendrez votre valeur s, de sorte que vous pouvez print(s) pour assurer le tableau est enregistré.

Swift 2:

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setValue(yourArrayOfDict, forKey: "customKey_SavedArray") 

les accès:

let s = defaults.objectForKey("customKey_SavedArray") as? [[String:AnyObject]] 

Maintenant, les s ici tient la valeur en tant que tableau de vos données, donc pas, vous pouvez y accéder en utilisant comme vous l'avez dit, let first_item = s[0], Ou, vous pouvez faire défiler les éléments dans le tableau en utilisant for in boucle.