J’ai des constantes NSSsortingng, que je veux appeler comme:
[newSsortingng isEqualToSsortingng:CONSTANT_STRING];
Un mauvais code ici?
J’ai eu cet avertissement:
envoi de ‘const NSSsortingng *’ au paramètre de type ‘NSSsortingng *’ élimine les qualificatifs
Comment devraient-ils être déclarés?
Vous devez déclarer votre chaîne constante comme suit:
NSSsortingng * const kSomeConstantSsortingng = @""; // constant pointer
au lieu de:
const NSSsortingng * kSomeConstantSsortingng = @""; // pointer to constant // equivalent to NSSsortingng const * kSomeConstantSsortingng = @"";
Le premier est un pointeur constant sur un object NSSsortingng
, tandis que le second est un pointeur sur un object NSSsortingng
constant.
L’utilisation d’un NSSsortingng * const
vous empêche de réaffecter kSomeConstantSsortingng à un object NSSsortingng
différent.
La méthode isEqualToSsortingng:
attend un argument de type NSSsortingng *
. Si vous passez un pointeur sur une chaîne constante ( const NSSsortingng *
), vous transmettez un résultat différent de celui attendu.
De plus, les objects NSSsortingng
sont déjà immuables, donc les rendre const NSSsortingng
est insignifiant.
juste pour mettre tout sur un endroit qui se trouve sur divers post sur stackoverflow et fonctionne pour moi, #define est mauvais parce que vous ne pouvez pas bénéficier de types de variables, essentiellement le compilateur remplace toutes les occurrences lors de la compilation
// Constants.h #import @interface Constants : NSObject extern NSSsortingng *APP_STATE_LOGGED_IN; extern NSSsortingng *APP_STATE_LOGGED_OUT; @end // Constants.m #import #import "Constants.h" @implementation Constants NSSsortingng *APP_STATE_LOGGED_IN = @"APP_STATE_LOGGED_IN"; NSSsortingng *APP_STATE_LOGGED_OUT = @"APP_STATE_LOGGED_OUT"; @end
épargnez quelques minutes pour lire ceci. Une bonne lecture des pointeurs sur les constantes et vice-versa.