J'utilise NSUSerDefaults pour stocker les préférences de l'utilisateur. Je me souviens avoir lu quelque part que définir les clés en tant que 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 en:
@implementation Controller
NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";
-(void)savePolygonInfo {
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:kPolygonNumberOfSides];
}
Bien que cela fonctionne, cela produit " warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type
". Je tiens à garder mon code exempt d'avertissements du compilateur. Comment puis-je corriger cet avertissement?
NSString * const foo
fonctionne car ilNSString
est immuable et le pointeur est immuable donc il ne peut jamais changer, correct? Aussi, je me souviens de C ++ quiconst
est implicitementstatic
(une optimisation du compilateur) donc pas besoin de l'appeler. Est-ce vrai ici aussi?Ne pas utiliser
const
avec des objets Objective-C, ils n'étaient pas vraiment conçus pour l'utiliser.NSString
les objets (parmi tant d'autres) sont déjà immuables par défaut en raison de leur conception, ilconst
est donc inutile de les fabriquer .Comme e.James l'a suggéré , vous pouvez utiliser un
NSString * const
, qui est un pointeur constant vers un fichierNSString
. C'est subtilement différent de aconst NSString *
(équivalent àNSString const *
), qui est un pointeur vers une constanteNSString
. L'utilisation de aNSString * const
vous empêche de réaffecterkPoly
pour pointer vers un nouvelNSString
objet.la source
const
signifie également que vous ne pouvez pas le réaffecter. Je suppose que je me suis trompé.Pour l'accès depuis d'autres classes:
.h
extern NSString * const PolygonNumberOfSidesPrefsKey;
.m
NSString * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
Pour accéder uniquement à l'intérieur de la classe actuelle:
.m
static NSString * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
la source
Je suggérerais 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:
au lieu.
la source