Сравнение NSNumber с 0 не работает?
В моем приложении есть парсер JSON, и я загружаю значение в переменную detailDataSourceDict. Когда я пытаюсь получить valueForKey из массива и попытаюсь сравнить его с 0, он никогда не работает...
Здесь мой код:
if (indexPath.row == 1) {
NSNumber *rating = [detailDataSourceDict valueForKey:@"rating"];
NSLog(@"Rating: %@",rating);
if (rating == 0) {
cell.detailTextLabel.text = @"This sheet has not yet been rated.";
}
else {
cell.detailTextLabel.text = [NSString stringWithFormat:@"This sheet has a %@ star rating.",rating];
}
cell.textLabel.text = @"Rating";
}
Я вижу в своем канале JSON "рейтинг": "0", но когда рейтинг равен 0, он показывает "Этот лист имеет рейтинг 0 звезд". Вместо "Этот лист еще не был оценен".
Любые предложения? Спасибо.
Ответы
Ответ 1
NSNumber *rating
- это объект. 0
является примитивным типом.
Примитивные типы можно сравнить с ==
. Объекты не могут; их нужно сравнивать для равенства с помощью isEqual:
.
Таким образом, замените это:
rating == 0
с:
[rating isEqual:@0]
(@0
является литералом NSNumber)
или, альтернативно:
rating.integerValue == 0
Причина, по которой ваш неправильный код даже компилируется, заключается в том, что 0
равен 0x0
, который в свою очередь равен nil
(вид, сохраняющий детали).
Итак, ваш текущий код будет эквивалентен этому:
rating == nil
Ответ 2
rating
является указателем на объект NSNumber, если вы сравниваете его с == 0
, вы будете сравнивать только указатель.
Если вы хотите сравнить значение с 0, вам нужно получить фактическое значение, используя intValue
, попробуйте;
if ([rating intValue] == 0) {
Ответ 3
NSNumber - это объект, и вам нужно получить доступ к этому значению со средствами доступа к данным.
[NSNumber intValue];
См. "Доступ к числовым значениям" @:
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html
Ответ 4
Вы хотите изменить его:
if (rating == 0) {
Для
if ([rating intValue] == 0) {