2013-08-14 1 views
0

Je crée une classe qui va stocker les statistiques pour mon jeu. Je voudrais stocker chaque score rond dans un tableau mutable qui peut être conservé et écrit dans un fichier. J'utilise le protocole NSCoding et implémente les méthodes encodeWithCoder et initWithCoder.Comment encoder et décoder un tableau de nombres en Objective-C?

#define masteredComponentsKey @"masteredComponents" 
#define scoresKey @"scores" 
-(void)encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeObject:_masteredComponents forKey:masteredComponentsKey]; 
    [encoder encodeObject:_scores forKey:scoresKey]; 

} 

-(id)initWithCoder:(NSCoder *)decoder 
{ 
    self = [super init]; 
    if (self) 
    { 
     _masteredComponents = [decoder decodeObjectForKey:masteredComponentsKey]; 
     _scores = [decoder decodeObjectForKey:scoresKey]; 
    } 
    return self; 
} 

Comme les tableaux sont des pointeurs vers des objets en Objective-C, je me dis que mes scores doivent être un nombre entier d'objets-Enveloppé comme un NSNumber ou NSValue. Cependant, ces objets n'implémentent pas le protocole NSCoding.

Alors, quelle est la meilleure façon de conserver un tas de nombres en utilisant NSCoding?

---- Ceci est mon premier post StackOverflow donc s'il vous plaît excuse tout le décorum inhabituel ----

+0

Je recommande les méthodes '' NSArray' writeToFile: atomiquement: 'et' arrayWithContentsOfFile: 'méthodes pour écrire un tableau dans un fichier/la lecture d'un tableau à partir d'un fichier. – MaxGabriel

+0

C'est une bonne idée et j'avais envisagé d'utiliser writeToFile: atomiquement. Le problème étant que je voudrais la flexibilité d'enregistrer et de restaurer des types de données primitifs tels que int, BOOL, double. – altyus

Répondre

3

NSValue et NSNumber mettre en œuvre le protocole NSCoding afin que vous puissiez les utiliser ..

NSValue implémente NSSecureCoding qui est hérité de NSCoding, regardez le Reference

Ainsi vous pouvez les utiliser:

[encoder encodeObject:@(_scores) forKey:scoresKey]; 
... 
_scores = [[decoder decodeObjectForKey:scoresKey] intValue]; 
+0

ah oui c'était assis là dans la documentation. La seule chose que je signalerai à n'importe qui utilisant votre exemple de code, l'encodeObject peut être simplement appelé _scores. Merci pour l'info! – altyus

Questions connexes