Estou usando NSUSerDefaults para armazenar as preferências do usuário. Lembro-me de ter lido em algum lugar que definir as chaves como constantes é uma boa ideia - e eu concordo. O código a seguir é o que eu tenho atualmente:
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:@"polygonNumberOfSides"];
Tentei mudar isso para:
@implementation Controller
NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";
-(void)savePolygonInfo {
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:kPolygonNumberOfSides];
}
Enquanto isso funciona, ele produz " warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type
". Estou ansioso para manter meu código livre de avisos do compilador. Como posso corrigir esse aviso?
NSString * const foo
funciona porqueNSString
é imutável e o ponteiro é imutável, então nunca pode mudar correto? Além disso, lembro-me do C ++ queconst
é implicitamentestatic
(uma otimização do compilador), então não há necessidade de chamá-lo. Isso também é verdade aqui?Não use
const
com objetos Objective-C, eles não foram realmente projetados para usá-lo.NSString
objetos (entre muitos outros) já são imutáveis por padrão em virtude de seu design, portanto, torná-losconst
é inútil.Como e.James sugeriu , você pode usar um
NSString * const
, que é um ponteiro constante para umNSString
. Isso é sutilmente diferente de aconst NSString *
(equivalente aNSString const *
), que é um ponteiro para uma constanteNSString
. O uso de aNSString * const
impede que você reatribuakPoly
para apontar para um novoNSString
objeto.fonte
const
também significa que você não pode reatribuí-lo. Acho que entendi errado.Para acesso de outras classes:
.h
extern NSString * const PolygonNumberOfSidesPrefsKey;
.m
NSString * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
Para acesso apenas dentro da classe atual:
.m
static NSString * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
fonte
Eu sugeriria até mesmo tornar a constante mais descritiva. Uma constante para o número de lados de um polígono pode vir de qualquer lugar. Como sugestão, que tal:
em vez de.
fonte