Używam NSUSerDefaults do przechowywania preferencji użytkownika. Pamiętam, że czytałem gdzieś, że ustawienie kluczy jako stałych to dobry pomysł - i zgadzam się. Obecnie posiadam następujący kod:
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:@"polygonNumberOfSides"];
Próbowałem to zmienić na:
@implementation Controller
NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";
-(void)savePolygonInfo {
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:kPolygonNumberOfSides];
}
Chociaż to działa, generuje „ warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type
”. Chcę, aby mój kod był wolny od ostrzeżeń kompilatora. Jak mogę naprawić to ostrzeżenie?
NSString * const foo
działa, ponieważNSString
jest niezmienny, a wskaźnik jest niezmienny, więc nigdy nie może się zmienić, prawda? Przypominam sobie również z C ++, żeconst
jest to niejawnestatic
(optymalizacja kompilatora), więc nie ma potrzeby tego wywoływać. Czy to prawda również tutaj?Nie używaj
const
z obiektami Objective-C, tak naprawdę nie zostały zaprojektowane do używania tego.NSString
obiekty (wśród wielu innych) są już domyślnie niezmienne ze względu na ich projekt, więc ich tworzenieconst
jest bezużyteczne.Jak zasugerował e.James , możesz użyć znaku
NSString * const
, który jest stałym wskaźnikiem do plikuNSString
. Różni się to nieco od aconst NSString *
(odpowiednikNSString const *
), który jest wskaźnikiem do stałejNSString
. Użycie aNSString * const
zapobiega ponownemu przypisaniukPoly
do nowegoNSString
obiektu.źródło
const
również oznacza, że nie możesz go ponownie przypisać. Chyba się pomyliłem.Aby uzyskać dostęp z innych klas:
.h
extern NSString * const PolygonNumberOfSidesPrefsKey;
.m
NSString * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
Dostęp tylko do aktualnej klasy:
.m
static NSString * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
źródło
Sugerowałbym nawet uczynienie tej stałej bardziej opisową. Stała określająca liczbę boków wielokąta może pochodzić z dowolnego miejsca. Jako sugestia, co powiesz na:
zamiast.
źródło