Utiliser une constante NSSsortingng comme clé pour NSUserDefaults

J’utilise NSUSerDefaults pour stocker les préférences de l’utilisateur. Je me rappelle avoir lu quelque part que définir les clés comme des constantes est une bonne idée – et je suis d’accord. Le code suivant est ce que j’ai actuellement:

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:polygon.numberOfSides] forKey:@"polygonNumberOfSides"]; 

J’ai essayé de changer cela pour:

 @implementation Controller NSSsortingng const *kPolygonNumberOfSides = @"polygonNumberOfSides"; -(void)savePolygonInfo { [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:polygon.numberOfSides] forKey:kPolygonNumberOfSides]; } 

Bien que cela fonctionne, il produit “un warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type “. Je tiens à garder mon code exempt des avertissements du compilateur. Comment puis-je corriger cet avertissement?

Tu devrais utiliser:

 NSSsortingng * const kPolygonNumberOfSides = @"..."; // const pointer 

au lieu de:

 NSSsortingng const * kPolygonNumberOfSides = @"..."; // pointer to const 

Le premier est un pointeur constant sur un object NSSsortingng, tandis que le second est un pointeur sur un object NSSsortingng constant.

C’est une différence subtile. L’avertissement du compilateur se produit car setObject:forKey: est déclaré comme suit:

 - (void)setObject:(id)value forKey:(NSSsortingng *)defaultName; 

Il s’attend à ce que l’argument defaultName soit de type NSSsortingng * . Lorsque vous passez plutôt un pointeur à une constante, vous lui avez donné quelque chose de différent.

Mise à jour: je tiens à souligner que ces constantes doivent être définies comme static si elles ne sont utilisées que dans un seul fichier. Je dis cela parce que j’ai moi-même rencontré ce problème: si vous ne les déclarez pas statiques, elles existeront dans l’espace de noms global et vous ne pourrez pas utiliser une variable avec le même nom dans un autre fichier. voir Constantes dans Objective-C pour plus d’informations. Pour expliquer par exemple, .m ce que j’utilise actuellement pour les clés que je n’ai besoin d’utiliser que dans un fichier .m :

 static NSSsortingng * const kSomeLabel = @"..."; 

N’utilisez pas const avec les objects Objective-C, ils n’étaient pas vraiment conçus pour l’utiliser. NSSsortingng objects NSSsortingng (parmi beaucoup d’autres) sont déjà immuables par défaut en raison de leur conception, les rendre const est donc inutile.

Comme e.James l’a suggéré , vous pouvez utiliser un NSSsortingng * const , qui est un pointeur constant vers une NSSsortingng . Ceci est subtilement différent d’un const NSSsortingng * (équivalent à NSSsortingng const * ), qui est un pointeur sur une NSSsortingng constante. L’utilisation d’un NSSsortingng * const vous empêche de réaffecter kPoly à un nouvel object NSSsortingng .

Pour accéder à d’autres classes:

.h

 extern NSSsortingng * const PolygonNumberOfSidesPrefsKey; 

.m

 NSSsortingng * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSidesPrefsKey" 

Pour l’access uniquement dans la classe actuelle:

.m

 static NSSsortingng * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSidesPrefsKey" 

Je suggère même de rendre la constante plus descriptive. Une constante pour le nombre de côtés d’un polygone peut provenir de n’importe où. À titre de suggestion, que diriez-vous de:

 kDefaultsPolygonNumberOfSides; 

au lieu.

Pour plus d’informations sur ce problème, il existe un excellent article sur Wikipedia expliquant la constante syntaxe avec des pointeurs: http://en.wikipedia.org/wiki/Const_correctness#Pointers_and_references