2013-06-04 3 views
1

Я принимаю NSDictionary с использованием AFNetworking. этот словарь имеет много значений.Отображение числа в виде строки

один из них я считаю INT или NSNumber, не знаю, что такое автоматическое преобразование. Число ожидаемых являются 2 и 3, но почему-то я всегда получаю очень длинный номер ... Я пробовал все, что я знаю и мог бы найти, но я не могу получить его, чтобы показать нужное количество в

cell.numberOfLikes.text 

Они являются все, что я пробовал без успеха. Я был бы признателен за руководство

NSLog(@"%i",_myDownloadedInfo[@"routines"][indexPath.row][@"routine"][@"routineDownloads"]); 

    NSLog(@"%i",[NSNumber numberWithInt:_myDownloadedInfo[@"routines"][indexPath.row][@"routine"][@"routineDownloads"]]); 

    cell.numberOfDownloads.text = [NSString stringWithFormat:@"%i",_myDownloadedInfo[@"routines"][indexPath.row][@"routine"][@"routineDownloads"]]; 

cell.numberOfLikes.text =_myDownloadedInfo[@"routines"][indexPath.row][@"routine"][@"routineDownloads"]); 
+2

Что это связано с 'AFNetworking'? Ваш вопрос заключается в получении номера из словаря. Источник словаря не имеет значения. – rmaddy

+0

Вы записываете указатели как целые числа. Это будет иметь тенденцию создавать большие числа. (Вы также игнорируете предупреждения от компилятора, я подозреваю.) –

ответ

4

Указанный формат %i предназначен для базовых целочисленных типов данных. Поскольку у вас есть (или попытайтесь создать) объект NSNumber, вы можете использовать %@, чтобы его зарегистрировать. %@ используется для объектов Objective-C в спецификаторах формата.

Но это не поможет, если вы хотите присвоить NSNumber текстовое поле. Вам необходимо преобразовать номер в NSString. В идеале вы должны использовать NSNumberFormatter для преобразования NSNumber в NSString.

ли это:

NSNumber *likesNumber = _myDownloadedInfo[@"routines"][indexPath.row][@"routine"][@"routineDownloads"]; 
NSString *numberText = [NSString stringWithFormat:@"%d". [likesNumber intValue]]; 
NSLog(@"Number: %@", numberText); 
cell.numberOfLikes.text = numberText; 
+2

или '[NSString stringWithFormat: @"% i ", number.intValue]', чтобы избежать необходимости изучения еще большего количества API-интерфейсов. –

+3

Кто черт возьми? (+1 для компенсации) –

+0

@ H2CO3 Но использование 'stringWithFormat' не будет правильно отформатировать номер в соответствии с локали пользователя. Конечно, с значениями 'int', которые не так много, как с значениями' float'. – rmaddy

0

Подсказка: %i является спецификатор преобразования для int.

один из них, я думаю, является INT или NSNumber, не знаю, что это автоматическое преобразование

Теперь вернитесь назад и прочитайте документацию по NSArray, подумайте о том, может ли она содержать int с, затем продолжить чтение.


Так объекты в словаре являются экземплярами NSNumber -> они объекты Objective-C -> они реализуются с помощью указателей. Плохой NSLog() пытается преобразовать значение указателя в целое число. Для получения описания числа используйте %@ или %i и [theNumber intValue], чтобы напечатать его целочисленное значение.

1

Несколько точек.

  • Во-первых, первым аргументом NSLog является спецификатор формата. Он полностью эквивалентен спецификатору формата, используемому в [NSString stringWithFormat:], и редко возникает необходимость в обоих.
  • Далее, данные в Objective-C могут быть индивидуальными значениями int, значениями char, значениями char* (которые являются строками C), значениями с плавающей запятой и объектами Objective-C. (Плюс несколько различных длинных, неподписанных и т. Д. Значений, которые вы редко используете.)
  • NSString - объект Objective-C, как NSNumber. С другой стороны, NSInteger представляет собой псевдоним для определенного размера int и, как правило, взаимозаменяемый с int. Очень часто люди путаются с NSNumber (объект) и NSInteger (scalar int) - это не.
  • В спецификаторе NSLog или stringWithFormat вы используете %, за которым следует один или несколько символов, чтобы указать способ форматирования значения (в следующем списке значений). %d или %i - int. (%d является предпочтительным.) %f - это простое значение с плавающей запятой (но форматирование их может усложниться). %s - строка в стиле C (то есть значение char*). %@ используется для форматирования объекта Objective-C. Вы используете %@, в частности, для форматирования NSString или (для получения представления по умолчанию) NSNumber.

Важно понимать, как %@ работает в строке формата. Когда интерпретатор формата встречает его, он интерпретирует следующий элемент в списке значений как указатель на объект Objective-C и вызывает метод description этого объекта. NSString просто возвращает себя в результате description, в то время как NSNumber возвращает NSString, которая представляет символьное представление значения числа. Другие объекты (все объекты Objective-C поддерживают description, если только по умолчанию) возвращают либо простую идентификацию типа объекта, либо представление внутренних значений объекта.

Так что, если у вас есть NSNumber, вы можете непосредственно отформатировать его с %@, или вы можете извлечь числовое значение (например, [someNSNumber intValue]), а затем отформатировать это значение соответствующим образом (например, %d). Причиной для этого было бы, если бы вы хотели указать ширину столбца для номера (например, %5d, чтобы отформатировать номер в поле с 5 позициями).

См. here для некоторых (gory) деталей по различным спецификаторам формата.

+0

Очень хороший ответ! –

Смежные вопросы