"L'invio di" const NSString * "al parametro di tipo" NSString * "scarta i qualificatori"


353

Ho Costanti NSString, che voglio chiamare come:

[newString isEqualToString:CONSTANT_STRING];

Qualche codice sbagliato qui?

Ho ricevuto questo avviso:

l'invio di 'const NSString *' al parametro di tipo 'NSString *' scarta i qualificatori

Come dovrebbero essere dichiarati?


2
come vengono definite queste stringhe?

Risposte:


917

Dovresti dichiarare la tua stringa costante come segue:

NSString * const kSomeConstantString = @""; // constant pointer

invece di:

const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";

Il primo è un puntatore costante a un NSStringoggetto, mentre il secondo è un puntatore a un NSStringoggetto costante .

L'uso di a NSString * constti impedisce di riassegnare kSomeConstantString per puntare a un NSStringoggetto diverso .

Il metodo isEqualToString:prevede un argomento di tipo NSString *. Se passi un puntatore a una stringa costante ( const NSString *), stai passando qualcosa di diverso da quello che si aspetta.

Inoltre, gli NSStringoggetti sono già immutabili, quindi renderli const NSStringinsignificanti.


3
Hai detto che il primo è il puntatore costante a un oggetto NSString. Ciò significa che il puntatore è costante. Quindi non posso riassegnarlo a un'altra NSString.
user4951

8
Vorrei poterti dare dieci voti! Grazie per la tua risposta comprensibile e molto utile!
Constantino Tsarouhas,

1
come mai NSString * const è un puntatore const a NSString? Qual è il loro generatore di grammatica senza contesto?
user4951

3
@Jim il problema è che non hai imparato C correttamente, non dare la colpa agli altri. Il constqualificatore si applica al termine alla sua sinistra e si applica al termine alla sua destra solo se non c'è nulla sul lato sinistro (ad es. const char *E char const *sono puntatori non costanti a const char, ma char *constè un puntatore const a char non const ).

8
+1. E +1000 per "Inoltre, gli oggetti NSString sono già immutabili, quindi renderli costanti NSString non ha senso."
Madbreaks,

6

solo per mettere tutto in un posto che ho trovato in vari post su stackoverflow e funziona per me, #define è male perché non puoi beneficiare di tipi variabili, in pratica il compilatore sostituisce tutte le occorrenze durante la compilazione (importa Costanti.h ogni volta che ti serve):

//  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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.