Estoy usando NSUSerDefaults para almacenar las preferencias del usuario. Recuerdo haber leído en alguna parte que establecer las claves como constantes es una buena idea, y estoy de acuerdo. El siguiente código es el que tengo actualmente:
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:@"polygonNumberOfSides"];
Intenté cambiar esto a:
@implementation Controller
NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";
-(void)savePolygonInfo {
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:kPolygonNumberOfSides];
}
Si bien esto funciona, produce " warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type
". Estoy dispuesto a mantener mi código libre de advertencias del compilador. ¿Cómo puedo solucionar esta advertencia?
NSString * const foo
funciona porqueNSString
es inmutable y el puntero es inmutable, por lo que nunca puede cambiar correctamente? Además, recuerdo de C ++ queconst
es implícitamentestatic
(una optimización del compilador), por lo que no es necesario mencionarlo. ¿Es eso cierto aquí también?No lo use
const
con objetos Objective-C, en realidad no fueron diseñados para usarlo.NSString
los objetos (entre muchos otros) ya son inmutables por defecto en virtud de su diseño, por lo que hacerlosconst
es inútil.Como sugirió e.James , puede usar an
NSString * const
, que es un puntero constante a unNSString
. Esto es sutilmente diferente de aconst NSString *
(equivalente aNSString const *
), que es un puntero a una constanteNSString
. El uso de aNSString * const
evita que reasignekPoly
para apuntar a un nuevoNSString
objeto.fuente
const
también significa que no puedes reasignarlo. Supongo que me equivoqué.Para acceder desde otras clases:
.h
extern NSString * const PolygonNumberOfSidesPrefsKey;
.metro
NSString * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
Para acceder solo dentro de la clase actual:
.metro
static NSString * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
fuente
Sugeriría incluso hacer la constante más descriptiva. Una constante para el número de lados de un polígono podría provenir de cualquier lugar. Como sugerencia, ¿qué tal:
en lugar.
fuente