Я использую NSUSerDefaults для хранения пользовательских настроек. Я помню, как где-то читал, что установка ключей как констант - хорошая идея, и я согласен. Сейчас у меня есть следующий код:
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:@"polygonNumberOfSides"];
Я попытался изменить это на:
@implementation Controller
NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";
-(void)savePolygonInfo {
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:kPolygonNumberOfSides];
}
Хотя это действительно работает, оно производит " warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type
". Я стремлюсь уберечь свой код от предупреждений компилятора. Как исправить это предупреждение?
NSString * const foo
работает, потому чтоNSString
он неизменен, а указатель неизменен, поэтому он никогда не может измениться правильно? Кроме того, я вспоминаю из C ++, чтоconst
это неявноstatic
(оптимизация компилятора), поэтому нет необходимости вызывать это. Это правда и здесь?Не используйте
const
с объектами Objective-C, они на самом деле не предназначены для его использования.NSString
объекты (среди многих других) уже неизменяемы по умолчанию в силу их дизайна, поэтому создавать ихconst
бесполезно.Как предположил Э. Джеймс , вы можете использовать
NSString * const
, который является постоянным указателем наNSString
. Это немного отличается отconst NSString *
(эквивалентNSString const *
), который является указателем на константуNSString
. Использование неNSString * const
позволяет переназначитьkPoly
указатель на новыйNSString
объект.источник
const
также означает, что вы не можете переназначить его. Думаю, я ошибся.Для доступа из других классов:
.час
extern NSString * const PolygonNumberOfSidesPrefsKey;
.m
NSString * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
Для доступа только внутри текущего класса:
.m
static NSString * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
источник
Я бы посоветовал даже сделать константу более наглядной. Константа для количества сторон многоугольника может поступать откуда угодно. Как насчет предложения:
вместо.
источник