«L'envoi de« const NSString * »au paramètre de type« NSString * »élimine les qualificatifs»

353

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?

user4951
la source
2
comment ces chaînes sont-elles définies?

Réponses:

917

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 vers un NSStringobjet, tandis que le second est un pointeur vers un NSStringobjet constant .

L'utilisation de a NSString * constvous empêche de réaffecter kSomeConstantString pour pointer vers un autre NSStringobjet.

La méthode isEqualToString:attend un argument de type NSString *. 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 NSStringobjets sont déjà immuables, donc les fabriquer const NSStringn'a pas de sens.

Albertamg
la source
3
Vous avez dit que le premier pointeur constant vers un objet NSString. Cela signifie donc que le pointeur est constant. Par conséquent, je ne peux pas réaffecter cela à une autre NSString.
user4951
8
J'aimerais pouvoir vous donner dix votes positifs! Merci pour votre réponse compréhensible et très utile!
Constantino Tsarouhas
1
comment dans la terre NSString * const est un pointeur const vers NSString? Quel est leur générateur de grammaire sans contexte?
user4951
3
@ Jim, le problème est que vous n'avez pas appris correctement le C, ne le blâmez pas pour les autres. Le constqualificatif 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 exemple const char *et a char const *sont des pointeurs non const vers const char, mais char *constest un pointeur const vers char non const ).
8
+1. Et +1000 pour "En outre, les objets NSString sont déjà immuables, donc les rendre const NSString n'a aucun sens."
Madbreaks
6

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):

//  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
gelé_
la source