J'ai des constantes NSString, que je veux appeler comme:
[newString isEqualToString:CONSTANT_STRING];
Un mauvais code ici?
J'ai reçu cet avertissement:
l'envoi de 'const NSString *' au paramètre de type 'NSString *' élimine les qualificatifs
Comment les déclarer?
objective-c
nsstring
warnings
constants
user4951
la source
la source
Réponses:
Vous devez déclarer votre chaîne constante comme suit:
au lieu de:
Le premier est un pointeur constant vers un
NSString
objet, tandis que le second est un pointeur vers unNSString
objet constant .L'utilisation de a
NSString * const
vous empêche de réaffecter kSomeConstantString pour pointer vers un autreNSString
objet.La méthode
isEqualToString:
attend un argument de typeNSString *
. Si vous passez un pointeur sur une chaîne constante (const NSString *
), vous passez quelque chose de différent de ce qu'il attend.De plus, les
NSString
objets sont déjà immuables, donc les fabriquerconst NSString
n'a pas de sens.la source
const
qualificatif s'applique au terme à sa gauche, et il ne s'applique au terme à sa droite que s'il n'y a rien sur son côté gauche (par exempleconst char *
et achar const *
sont des pointeurs non const vers const char, maischar *const
est un pointeur const vers char non const ).juste pour mettre tout en un seul endroit qui a trouvé sur divers articles sur stackoverflow et qui fonctionne pour moi, #define est mauvais parce que vous ne pouvez pas bénéficier de types de variables, fondamentalement, le compilateur remplace toutes les occurrences lors de la compilation (importez Constants.h chaque fois que vous en avez besoin):
la source
épargnez quelques minutes pour lire ceci. Une bonne lecture sur les pointeurs de l'enfer sur les constantes et vice-versa.
http://c-faq.com/decl/spiral.anderson.html
la source