Каков правильный способ проверки нулевой строки в Objective-C?

Я использовал это в своем приложении для iPhone

if (title == nil) {
    // do something
}

но он вызывает какое-то исключение, а консоль показывает, что заголовок "(null)".

Итак, я использую это сейчас:

if (title == nil || [title isKindOfClass:[NSNull class]]) {
    //do something
}

В чем разница, и каков наилучший способ определить, является ли строка нулевой?

Ответ 1

Как указывали другие, существует много видов "null" в Cocoa/Objective C. Но еще одна вещь, которую следует отметить, состоит в том, что [title isKindOfClass: [класс NSNull]] бесцельно сложен, поскольку [NSNull null] документируется как одноэлементный, поэтому вы можете просто проверить равенство указателя. См. Темы для Cocoa: Использование Null.

Итак, хороший тест может быть:

if (title == (id)[NSNull null] || title.length == 0 ) title = @"Something";

Обратите внимание, что вы можете использовать тот факт, что даже если заголовок равен nil, title.length вернет 0/nil/false, то есть 0 в этом случае, так что вам не нужно его использовать. Это то, к чему люди, которые не знакомы с Objective C, не могут привыкнуть, особенно приступая к другим языкам, на которых вызовы сообщений/методов обращаются в нуль.

Ответ 2

это так же просто, как

if([object length] >0)
{
  // do something
}

помните, что в объекте C, если объект равен null, он возвращает 0 в качестве значения.

Это даст вам как пустую строку, так и строку длиной 0.

Ответ 3

Обратитесь к следующим статьям на этом сайте:

Я думаю, что ваша ошибка связана с чем-то другим, поскольку вам не нужно выполнять дополнительную проверку.

Также см. этот связанный вопрос: Надлежащая проверка столбца текста nil sqlite

Ответ 4

Что со всеми этими "работает для меня ответы"? Мы все кодируем на одном языке, а правила -

  • Убедитесь, что ссылка не nil
  • Проверьте и убедитесь, что длина строки не равна 0

Вот что будет работать для всех. Если данное решение работает только "для вас", его только потому, что поток вашего приложения не позволит сценарию, где ссылка может быть нулевой или длина строки равна 0. Правильный способ сделать это - это метод, который будет обрабатывать что вы хотите во всех случаях.

Ответ 5

Я обнаружил, что для того, чтобы действительно сделать это правильно, вам нужно сделать что-то похожее на

if ( ( ![myString isEqual:[NSNull null]] ) && ( [myString length] != 0 ) ) {
}

В противном случае вы получите странные ситуации, когда управление все равно будет обходить ваш чек. Я не сталкивался с тем, что пропустил проверку isEqual и длины.

Ответ 6

Если вы хотите протестировать все ноль/пустые объекты (например, пустые строки или пустые массивы/наборы), вы можете использовать следующее:

static inline BOOL IsEmpty(id object) {
    return object == nil
        || ([object respondsToSelector:@selector(length)]
        && [(NSData *) object length] == 0)
        || ([object respondsToSelector:@selector(count)]
        && [(NSArray *) object count] == 0);
}

Ответ 7

Есть две ситуации:

Возможно, что объект [NSNull null], или это невозможно.
 Ваше приложение обычно не должно использовать [NSNull null];, вы используете его только в том случае, если вы хотите поместить объект "null" в массив или использовать его как значение словаря. И тогда вы должны знать, какие массивы или словари могут содержать нулевые значения, а какие нет.
 Если вы считаете, что массив никогда не содержит значений [NSNull null], то не проверяйте его. Если есть [NSNull null], вы можете получить исключение, но это нормально: исключения Objective-C указывают на ошибки программирования. И у вас есть ошибка программирования, которая требует исправления путем изменения некоторого кода.

Если объект может быть [NSNull null], то вы проверяете это достаточно просто, тестируя   (object == [NSNull null]). Вызов isEqual или проверка класса объекта - глупость. Существует только один объект [NSNull null], и простой старый оператор C проверяет его просто отлично самым простым и эффективным способом.

Если вы отметили объект NSString, который не может быть [NSNull null] (потому что вы знаете, что он не может быть [NSNull null] или потому, что вы только что отметили, что он отличается от [NSNull null]), вам нужно спросить себя, как вы хотите для обработки пустой строки, то есть с длиной 0. Если вы рассматриваете это строка null, например nil, тогда проверьте (object.length == 0). object.length вернет 0, если object == nil, поэтому этот тест охватывает nil объекты и строки с длиной 0. Если вы обрабатываете строку длины 0, отличную от строки nil, просто проверьте, не существует ли object == nil.

Наконец, если вы хотите добавить строку в массив или словарь, а строка может быть нулевой, у вас есть выбор, не добавляя ее, заменив ее на @"" или заменив ее на [NSNull null]. Замена его на @"" означает, что вы теряете возможность различать "no string" и "string of length 0". Замена его на [NSNull null] означает, что вам нужно писать код при доступе к массиву или словарю, который проверяет объекты [NSNull null].

Ответ 8

Вы просто проверяете нуль

if(data[@"Bonds"]==nil){
  NSLog(@"it is nil");
}

или

if ([data[@"Bonds"] isKindOfClass:[NSNull class]]) {
    NSLog(@"it is null");
}

Ответ 9

Вот макрос, который я использую для безопасной строки вместо получения строки "(null)" в UILabel, например:

#define SafeString(STRING) ([STRING length] == 0 ? @"" : STRING)

допустим, у вас есть свойство класса и имени члена, а имя - nil:

NSLog(@"%@", member.name); // prints (null) on UILabel

с макросом:

NSLog(@"%@", SafeString(member.name)); // prints empty string on UILabel

красиво и чисто.

Ответ 10

if(textfield.text.length == 0){
   //do your desired work
}

Ответ 11

Попробуйте это для проверки null

 if (text == nil)

Ответ 12

@interface NSString (StringFunctions)
- (BOOL) hasCharacters;
@end

@implementation NSString (StringFunctions)
- (BOOL) hasCharacters {
    if(self == (id)[NSNull null]) {
        return NO;
    }else {
        if([self length] == 0) {
            return NO;
        }
    }
    return YES;
}
@end

NSString *strOne = nil;
if([strOne hasCharacters]) {
    NSLog(@"%@",strOne);
}else {
    NSLog(@"String is Empty");
}

Это будет работать со следующими случаями: NSString *strOne = @"" ИЛИ NSString *strOne = @"StackOverflow" ИЛИ NSString *strOne = [NSNull null] ИЛИ NSString *strOne.

Ответ 13

Если такого рода вещи еще не существуют, вы можете создать категорию NSString:

@interface NSString (TrucBiduleChoseAdditions)

- (BOOL)isEmpty;

@end

@implementation NSString (TrucBiduleChoseAdditions)

- (BOOL)isEmpty {
    return self == nil || [@"" isEqualToString:self];
}

@end

Ответ 14

Что для меня работает if ( !myobject )

Ответ 15

Полная проверка строки для нулевых условий может быть следующей: <\br >

    if(mystring)
     {
       if([mystring isEqualToString:@""])
        {
          [email protected]"some string";
        }
     }    
    else
     {
        //statements
     }

Ответ 16

Я проверяю только нулевую строку с помощью

if ([myString isEqual: [NSNull null]])

Ответ 17

Для строки:

+ (BOOL) checkStringIsNotEmpty:(NSString*)string {
if (string == nil || string.length == 0) return NO;
return YES;

}

Смотрите картинку ниже:

enter image description here

Ответ 18

Для строки:

+ (BOOL) checkStringIsNotEmpty:(NSString*)string {
if (string == nil || string.length == 0) return NO;
return YES;}

Ответ 20

if ([strpass isEqual:[NSNull null]] || strpass==nil || [strpass isEqualToString:@"<null>"] || [strpass isEqualToString:@"(null)"] || strpass.length==0 || [strpass isEqualToString:@""])
{
    //string is blank  
}