Сравнение строк NSS и предупреждения о номерах NSN - PullRequest
2 голосов
/ 20 июня 2011

Иногда JSON возвращает (null) из базы данных, где он получает данные, поэтому я проверяю, вернул ли он, что (null).

else if (NSOrderedSame == [[clubsArray objectAtIndex:indexPath.row] compare:@"(null)"] )

Но Xcode предупреждает меня

Несовместимые типы Objective-C 'struct NSString *', ожидаемый 'struct NSNumber *' при передаче аргумента 1 типа 'compare:' из отличного типа Objective-C

Я добавляю NSString s в этот массив, поэтому я не понимаю, почему он говорит о структуре.

NSString *clubNameReturned = [message objectForKey:@"clubname"];
[clubsArray addObject:clubNameReturned];

Кто-нибудь может пролить свет на то, что здесь происходит?

Кодвыполняется так, как я ожидаю, но я не хочу делать что-то не то.

Ответы [ 4 ]

5 голосов
/ 20 июня 2011

JSON не возвращает строку "(null)".Эта строка "(null)" - это только то, что отображается на консоли, когда вы NSLog обнуляете одноэлементный объект (это description представление).

Сравнение вместо [NSNull null] вместо этого, что составляет singletonособенно используется для хранения чего-либо, что представляет значение null / nil в контейнерах .

1 голос
/ 20 июня 2011

Это потому, что определение метода compare::

- (NSComparisonResult)compare:(NSNumber *)otherNumber;

То есть ожидается объект NSNumber, но вы передаете строку NSString.

Если вы хотите проверить, совпадают ли 2 строки NSS, используйте метод isEqualToString::

else if ([[clubsArray objectAtIndex:indexPath.row] isEqualToString:@"(null)"])

Однако, скорее всего, это не возвращаемая строка (хотя это то, что вы видите, когда она выводится на консоль), поэтому вместо этого вы должны сделать:

else if ([clubsArray objectAtIndex:indexPath.row] == [NSNull null])
0 голосов
/ 21 июня 2011

Я предлагаю вам использовать эту категорию в NSDictionary для работы с нулевыми значениями в данных JSON:

TouchJSON для работы с NSNull

0 голосов
/ 21 июня 2011

Предупреждение исчезнет, ​​если вы явно опущены, например ::

if (NSOrderedSame == [(NSString *)[clubsArray objectAtIndex:indexPath.row] compare:@"(null)"] )

В результате вы вызываете метод compare: для результата [clubsArray objectAtIndex:indexPath.row], который имеет тип id. Теперь неявное понижение рейтинга разрешено с id на любой другой тип ... но в вашем случае компилятор не может сказать, какой именно тип вам нужен. Это NSNumber или NSString или NSDate ...? (Кстати, NSObject не отвечает на compare:). Это предупреждение, потому что компилятор думает, что вы предоставите правильные типы во время выполнения (что вы делаете!), Но он говорит вам, что вы должны быть более явными с таким кодом.

...