Строки, определенные как константы, не являются NSStrings? - PullRequest
0 голосов
/ 03 сентября 2011

У меня есть константа, определенная как:

#define BEGIN_IMPORT_STRING @"Importing Hands!";

Но я получаю сообщение об ошибке при попытке выполнить конкататацию с:

NSString *updateStr = [NSString stringWithFormat:@"%@%@", BEGIN_IMPORT_STRING, @" - Reading "];

Этого не произойдет, если я заменю его настроковый литерал

NSString *updateStr = [NSString stringWithFormat:@"%@%@", @"foo", @" - Reading "];

или локальная строка

NSString *temp = @"foo";
NSString *updateStr = [NSString stringWithFormat:@"%@%@", temp, @" - Reading "];

Ответы [ 4 ]

4 голосов
/ 03 сентября 2011

Вам необходимо удалить точку с запятой из вашего #define:

#define BEGIN_IMPORT_STRING @"Importing Hands!"

Для компилятора результирующая строка выглядит следующим образом:

NSString *updateStr = [NSString stringWithFormat:@"Importing Hands!";, @" - Reading "];
4 голосов
/ 03 сентября 2011

Заменить

#define BEGIN_IMPORT_STRING @"Importing Hands!";

с

#define BEGIN_IMPORT_STRING @"Importing Hands!"

Это потому, что компилятор в вашем случае заменяет все вхождения BEGIN_IMPORT_STRING на @"Importing Hands!";

2 голосов
/ 03 сентября 2011

Помимо принятого ответа (удалите точку с запятой), обратите внимание, что:

  • @"Foo" - это строка NSS. Вы даже можете отправить ему сообщение.
  • #define FOO @"Foo" - это макрос препроцессора, а не константа. Это набор текста.

Хотя макросы не являются редким способом избежать повторного ввода одной и той же строки, они являются неудачным удержанием. По сути, они играют в игры, которые больше не нужны.

Для повторяющихся строк я предпочитаю:

static NSString *const Foo = @"Foo;

Часть const этого определения гарантирует, что указатель заблокирован, так что Foo нельзя указывать на другой объект.

Часть static ограничивает область действия файла. Если вы хотите получить к нему доступ из других файлов, удалите static и добавьте следующую декларацию в заголовочный файл:

extern NSString *const Foo;
1 голос
/ 03 сентября 2011

Если вы используете

   NSLocalizedString(@"Importing Hands!", @"Message shown when importing of hands starts");  

?

Я назвал это ответом, потому что это похоже на то, что вам не хотелось бы идти и повторять весь ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...