Я пытаюсь использовать stringWithFormat для установки числового значения в текстовом свойстве метки, но следующий код не работает. Я не могу передать int в NSString. Я ожидал, что этот метод знает, как автоматически преобразовать int в NSString.
Что мне здесь нужно делать?
- (IBAction) increment: (id) sender
{
int count = 1;
label.text = [NSString stringWithFormat:@"%@", count];
}





Сделай это:
label.text = [NSString stringWithFormat:@"%d", count];
Вы хотите использовать %d или %i для целых чисел. %@ используется для объектов.
Однако стоит отметить, что следующий код решает ту же задачу и намного понятнее.
label.intValue = count;
Имейте в виду, что @ "% d" будет работать только на 32-битной версии. Как только вы начнете использовать NSInteger для совместимости, если вы когда-либо компилируете для 64-битной платформы, вы должны использовать @ "% ld" в качестве спецификатора формата.
Использование %ld при компиляции для 32-битного устройства теперь выдает предупреждение. Какой путь безопаснее? Используете %ld с 32 битами или используете %d с 64?
Неважно, я вижу примечание Сквеларта о кастинге на long в первую очередь. Это помогает и теперь компилируется для любой цели без предупреждения!
А за комедийную ценность:
label.text = [NSString stringWithFormat:@"%@", [NSNumber numberWithInt:count]];
(Хотя это может быть полезно, если однажды вы имеете дело с NSNumber)
Или используйте современный синтаксис objective-c и используйте: [NSString stringWithFormat: @ "% @", @ (count)]
Марк Шарбонно писал:
Keep in mind that @"%d" will only work on 32 bit. Once you start using NSInteger for compatibility if you ever compile for a 64 bit platform, you should use @"%ld" as your format specifier.
Интересно, спасибо за подсказку, я использовал @ "% d" со своими NSInteger!
В документации SDK также рекомендуется преобразовать NSInteger в long в этом случае (чтобы соответствовать @ "% ld"), например:
NSInteger i = 42;
label.text = [NSString stringWithFormat:@"%ld", (long)i];
Источник: Руководство по программированию строк для какао - спецификаторы формата строки (требуется регистрация разработчика iPhone)
Размещенный вами фрагмент - всего лишь образец, демонстрирующий, что вы пытаетесь сделать?
Причина, по которой я спрашиваю, заключается в том, что вы назвали метод increment, но, похоже, вы используете его для установки значения текстовой метки, а не для увеличения значения.
Если вы пытаетесь сделать что-то более сложное, например, установить целочисленное значение и отобразить это значение в метке, вы можете рассмотреть возможность использования привязок. например
Вы объявляете свойство count, и ваше действие increment устанавливает для этого значения любое значение, а затем в IB вы привязываете текст метки к значению count. Пока вы следуете Key Value Coding (KVC) с count, вам не нужно писать какой-либо код для обновления отображения метки. А с точки зрения дизайна у вас более слабая связь.
Не забудьте для long long int:
long long int id = [obj.id longLongValue];
[NSString stringWithFormat:@"this is my id: %lld", id]
label.text = [NSString stringWithFormat:@"%d", XYZ];
//result: label.text = XYZ
//use %d for int values
Чтобы быть 32-битным и 64-битным, используйте один из Выражения в рамке:
label.text = [NSString stringWithFormat:@"%@", @(count).stringValue];
NSString * formattedname;
NSString * firstname;
NSString * middlename;
NSString * lastname;
firstname = @"My First Name";
middlename = @"My Middle Name";
lastname = @"My Last Name";
formattedname = [NSString stringWithFormat:@"My Full Name: %@ %@ %@", firstname, middlename, lastname];
NSLog(@"\n\nHere is the Formatted Name:\n%@\n\n", formattedname);
/*
Result:
Here is the Formatted Name:
My Full Name: My First Name My Middle Name My Last Name
*/
Это вызывает предупреждение при компиляции для 64-битных устройств, где
intфактически являетсяlong.