"отправка" const NSString * 'в параметр типа "NSString *" отбрасывает квалификаторы "предупреждение
У меня есть константа NSString, которую я хочу вызвать как:
[newString isEqualToString:CONSTANT_STRING];
Какой-либо неправильный код здесь?
Я получил это предупреждение:
отправка 'const NSString *' в параметр типа 'NSString *' отбрасывает квалификаторы
Как они должны быть объявлены?
Ответы
Ответ 1
Вы должны объявить свою постоянную строку следующим образом:
NSString * const kSomeConstantString = @""; // constant pointer
вместо:
const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";
Первый является постоянным указателем на объект NSString
, а последний является указателем на константный объект NSString
.
Использование NSString * const
не позволяет переназначить kSomeConstantString для указания на другой объект NSString
.
Метод isEqualToString:
ожидает аргумент типа NSString *
. Если вы передаете указатель на константную строку (const NSString *
), вы передаете нечто иное, чем оно ожидает.
Кроме того, объекты NSString
уже неизменяемы, поэтому сделать их const NSString
бессмысленными.
Ответ 2
просто чтобы поместить все на одно место, которое было найдено на разных постах в stackoverflow и работает для меня, #define плохо, потому что вы не можете использовать переменные типы, в основном компилятор заменяет все возникновение при компиляции (импортируйте Constants.h всякий раз, когда вам нужно ):
// Constants.h
#import <Foundation/Foundation.h>
@interface Constants : NSObject
extern NSString *APP_STATE_LOGGED_IN;
extern NSString *APP_STATE_LOGGED_OUT;
@end
// Constants.m
#import <Foundation/Foundation.h>
#import "Constants.h"
@implementation Constants
NSString *APP_STATE_LOGGED_IN = @"APP_STATE_LOGGED_IN";
NSString *APP_STATE_LOGGED_OUT = @"APP_STATE_LOGGED_OUT";
@end
Ответ 3
Сэкономьте несколько минут, чтобы прочитать это. Хороший пример для указателей на константы и наоборот.
http://c-faq.com/decl/spiral.anderson.html