Objective-C, как проверить, является ли строка нулевой - PullRequest
12 голосов
/ 08 марта 2010

SO Я хочу проверить, является ли элемент в моем массиве [clientDataArray objectForKey:@"ClientCompany"] nil.

    temp = [clientDataArray objectForKey:@"ClientCompany"];
    if (temp != [NSNull null]) infofieldCompany.text = temp;

До сих пор мне удавалось добиться этого с помощью приведенного выше кода, но он дает мне предупреждения

  • предупреждение: NSArray может не отвечать на -objectForKey:
  • предупреждение: сравнение различных Objective-C типов struct NSNull * и struct NSString * не хватает состава

Мой главный интерес - второе предупреждение, но первое предупреждение также интересует меня. Как мне адаптировать мой код выше?

Ответы [ 9 ]

20 голосов
/ 08 марта 2010

Ваше первое предупреждение выглядит так, как будто вы пытаетесь позвонить objectForKey на NSArray. Что не сработает, так как NSArray не имеет метода objectForKey.

Что касается второго предупреждения, вы можете просто сравнить его с нулем, то есть:

if (temp != nil)

или поскольку nil эквивалентен 0, вы также можете просто сделать:

if (temp)
16 голосов
/ 24 августа 2012

Попробовав все варианты, я думаю, что это лучший вариант для сравнения NSString null

if ( temp != ( NSString *) [ NSNull null ] )
{
  // do some thing
}
14 голосов
/ 08 марта 2010

В обоих приведенных ранее ответах пропущен фундаментальный момент: вы не можете поместить nil в массив, поэтому вы никогда не получите nil из массива. Использование NSNull в качестве заполнителя в массиве является правильным решением, однако ваша переменная temp не может быть объявлена ​​как NSString *, так как она может быть не одна. Используйте либо NSObject *, либо id в качестве типа переменной, чтобы отключить предупреждение о сравнении.

2 голосов
/ 03 декабря 2013

Лучшее решение для проверки значений NULL или Пусто:

if (yourObj.yourString == (NSString*) [NSNull null] || yourObj.yourString.length == 0 )
{
   yourObj.yourString = @"";
}
1 голос
/ 16 марта 2017

Тихо, просто

if (myString == nil){
     NSLog(@"myString is null");
}
0 голосов
/ 07 января 2013

Даже если этот вопрос старый, я надеюсь, что Мой ответ поможет кому-то еще.

Вы можете попробовать это

temp = [clientDataArray objectForKey:@"ClientCompany"];
if (![temp isKindOfClass:[NSNull class]]) infofieldCompany.text = temp;
0 голосов
/ 12 мая 2011

if (temp! = Nil)

или так как nil эквивалентно 0, вы также можете просто сделать:

if (temp)

Я никоим образом не являюсь экспертом по Obj-C или Cocoa, в C / C ++ вы можете использовать что-то вроде:

if (somePtr! = NULL)

И, если вы не указали явно значение NULL или не изменили то, на что оно указывало, Вы можете быть уверены, что на самом деле это не Null или Null (что бы вы ни искали ...)

Но я заметил (во всяком случае, мой личный опыт), что в Obj-C,

Если вы делаете что-то вроде: if (someObj! = nil) или наоборот,

Там нет гарантии, он скажет вам, что это настоящий статус ...

Итак (после того, как я столкнулся с кучей сбоев), когда я имею дело с Obj-C (BS), для безопасности, у меня всегда есть BOOL или флаг, установленный для отслеживания его статуса, так что вы не получите Free Я прошу прощения ... "Освобождение" чего-то, что уже было освобождено ...

0 голосов
/ 08 марта 2010

Синглтон NSNull может использоваться для создания "чередующихся" массивов, таких как obj0, obj1, obj2, NSNull, obj3, NSNull, ..., nil

предупреждение: NSArray может не отвечать to'-objectForKey: '

NSArray не реализует objectForKey.
Ваш код потерпит крах во время выполнения (если clientDataArray был выделен и инициализирован) Вы можете получить доступ к элементам массива по индексу ( objectAtIndex: ).
Если вам нужно связать объекты с ключами, взгляните на NSDictionary .

0 голосов
/ 08 марта 2010

Мне кажется, проблема в том (я имею в виду второе предупреждение), что вы сравниваете объект NSString, который может быть установлен равным нулю, с объектом NSNull.

Вы пробовали обычный C-способ проверки на ноль?

if(temp) {
// It's not null, do something.
}

Я не уверен на 100% в этом, но вы можете попробовать. Если вы это сделали, извините, что не смогу предоставить более полезную информацию.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...