NSLocalizedString — форматирует не строковый литерал и без аргументов формата (xcode)

#iphone #ios #objective-c #xcode4 #foundation

#iPhone #iOS #objective-c #xcode4 #основа

Вопрос:

Я получаю сообщение «форматировать не строку …» при выполнении следующего:

 NSString* string1 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Update Now", @"Update Now Item")];
NSString* string2 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Register", @"Register Now")];
  

Это работает нормально, т. е. приложение не вылетает на устройстве или симуляторе, и локализованный текст также отображается просто отлично.

Я пытаюсь понять, почему тогда я получаю это конкретное сообщение об ошибке. Насколько я знаю, именно так вы должны использовать локализованные строки в Objective C.

Ответ №1:

Самый простой способ использовать локализованную строку — это:

NSString* myString = NSLocalizedString(@»Обновить сейчас»,@»Обновить сейчас»);

Теперь имейте в виду, что myString автоматически освобождается, что обычно требуется для строки.

В приведенных вами примерах ваши строки сохранены (потому что вы используете initWithFormat). Предполагаю, что «обновить сейчас» и тому подобное будет показано в пользовательском интерфейсе, возможно, через UILabel вам не нужна сохраненная строка — когда вы назначаете строку UILabel, она сохранится автоматически (поскольку текст хранится в сохраненном свойстве)

Ответ №2:

NSLocalizedString — это макрос, который на самом деле;

 [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
  

Итак, с какой стати вам нужна другая NSString, если вы не выполняете некоторую постобработку, такую как замена формата, она все равно возвращает NSString!

вы можете сохранить его, если хотите…

Ответ №3:

Здесь вообще не следует использовать initWithFormat: , потому что вы имеете дело не со строкой формата.

Но если вы используете его, всегда используйте его следующим образом:

 [[NSString alloc] initWithFormat:@"%@", NSLocalizedString(@"Update Now", @"Update Now Item")];
  

В противном случае существует риск того, что результат NSLocalizedString содержит спецификатор формата строки (например, %d или что-то в этом роде), и это приведет к сбою вашего приложения.

Комментарии:

1. 1. Использование initWithString: вместо initWithFormat: тоже будет работать.

2. Или вы можете просто использовать, [[NSString alloc] initWithString:NSLocalizedString(@"Update Now", @"Update Now")]; вы должны использовать только -initWithFormat: , если вы на самом деле передаете строку формата.

3. Нет, он не должен. В этом случае он вообще не должен использовать initWithFormat: .

Ответ №4:

Предупреждение, выданное компилятором, является правильным. Строка, возвращаемая из NSLocalizedString(@"Update Now", @"Update Now Item") , не является строкой формата, поскольку внутри нее нет спецификатора формата.

Как сказал Ican Zilb в другом ответе, лучшим решением является прямое использование:

 NSString* myString = NSLocalizedString(@"Update Now",@"Update Now Item");