Вы должны использовать:
NSString * const kPolygonNumberOfSides = @"..."; // const pointer
вместо:
NSString const * kPolygonNumberOfSides = @"..."; // pointer to const
Первый - это постоянный указатель на объект NSString, а второй - это указатель на постоянный объект NSString.
Это тонкая разница. Предупреждение компилятора происходит потому, что setObject:forKey:
объявлено следующим образом:
- (void)setObject:(id)value forKey:(NSString *)defaultName;
Ожидается, что аргумент defaultName
будет иметь тип NSString *
. Когда вы вместо этого передаете указатель на константу, вы даете ей что-то другое.
Обновление: Я хочу отметить, что эти константы должны быть определены как static
, если они будут использоваться только из одного файла. Я говорю это потому, что сам столкнулся с этой проблемой: если вы не объявите их как статические, они будут существовать в глобальном пространстве имен, и вы не сможете использовать переменную с таким же именем в другом файле. см. Константы в Objective-C для получения дополнительной информации. Для пояснения на примере это то, что я сейчас использую для ключей, которые мне нужно использовать только в одном .m
файле:
static NSString * const kSomeLabel = @"...";