J'ai les constantes NSString, que je veux appeler comme:
[newString isEqualToString:CONSTANT_STRING];
Un code erroné ici?
J'ai eu cet avertissement:
l'envoi de 'const NSString *' au paramètre de type 'NSString *' ignore les qualificateurs
Comment devrait-on les déclarer?
Vous devez déclarer votre chaîne constante comme suit:
NSString * const kSomeConstantString = @""; // constant pointer
au lieu de:
const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";
Le premier est un pointeur constant sur un objet NSString
, tandis que le dernier est un pointeur sur un objet constant NSString
.
L'utilisation d'un NSString * const
vous empêche de réaffecter kSomeConstantString pour pointer vers un autre objet NSString
.
La méthode isEqualToString:
attend un argument de type NSString *
. Si vous passez un pointeur sur une chaîne constante (const NSString *
), vous transmettez quelque chose de différent de ce à quoi il s'attend.
En outre, les objets NSString
étant déjà immuables, les rendre const NSString
n'a pas de sens.
juste pour mettre tous sur un endroit qui se trouve sur diverses publications sur stackoverflow et qui fonctionne pour moi, #define est mauvais parce que vous ne pouvez pas bénéficier de types de variable, le compilateur remplace fondamentalement toutes les occurrences lors de la compilation (importez Constants.h quand vous en avez besoin):
// Constants.h
#import <Foundation/Foundation.h>
@interface Constants : NSObject
extern NSString *APP_STATE_LOGGED_IN;
extern NSString *APP_STATE_LOGGED_OUT;
@end
// Constants.m
#import <Foundation/Foundation.h>
#import "Constants.h"
@implementation Constants
NSString *APP_STATE_LOGGED_IN = @"APP_STATE_LOGGED_IN";
NSString *APP_STATE_LOGGED_OUT = @"APP_STATE_LOGGED_OUT";
@end
épargnez quelques minutes pour lire ceci. Une bonne lecture sur les pointeurs enfer sur les constantes et vice-versa.