objective c - "Enviar ''const NSString*'' a un parámetro de tipo ''NSString*'' descarta los calificadores" advertencia
objective-c warnings (3)
Tengo constantes NSString, que quiero llamar como:
[newString isEqualToString:CONSTANT_STRING];
¿Algún código equivocado aquí?
Recibí esta advertencia:
el envío de ''const NSString *'' al parámetro de tipo ''NSString *'' descarta los calificadores
¿Cómo se deben declarar?
Debes declarar tu cadena constante de la siguiente manera:
NSString * const kSomeConstantString = @""; // constant pointer
en lugar de:
const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";
El primero es un puntero constante a un objeto NSString
, mientras que el último es un puntero a un objeto NSString
constante.
El uso de una NSString * const
impide reasignar kSomeConstantString para que apunte a un objeto NSString
diferente.
El método isEqualToString:
espera un argumento de tipo NSString *
. Si pasa un puntero a una cadena constante ( const NSString *
), está pasando algo diferente de lo que espera.
Además, los objetos NSString
ya son inmutables, por lo que hacerlos const NSString
tiene sentido.
Dedique unos minutos para leer esto. Una buena lectura de punteros infierno en constantes y viceversa.
solo para poner todo en un lugar que se encuentra en varias publicaciones en y funciona para mí, #define es malo porque no puede beneficiarse de los tipos de variables, básicamente el compilador reemplaza toda la aparición cuando se compila (importa Constantes.h cuando lo necesite):
// 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