web-dev-qa-db-fra.com

avertissement "envoi 'const NSString *' au paramètre de type 'NSString *' ignore le qualificatif"

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?

341
user4951

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.

894
albertamg

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
6
freezing_

épargnez quelques minutes pour lire ceci. Une bonne lecture sur les pointeurs enfer sur les constantes et vice-versa.

http://c-faq.com/decl/spiral.anderson.html

4
user3693546