it-swarm.com.ru

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

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

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

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

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

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

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

177
Teo Choong Ping

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

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

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

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

386
Peter N Lewis

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

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

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

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

24
Bluephlame

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

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

Также смотрите этот связанный вопрос: Правильная проверка текстового столбца nil sqlite

6
TimM

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

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

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

5
nenchev

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

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

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

5
Guardius

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

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);
}
4
diederikh

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

Возможно, что объект является [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, тогда test (object.length == 0). Object.length вернет 0, если object == nil, поэтому этот тест охватывает ноль объектов и строк длиной 0. Если вы обрабатываете строку длиной 0, отличную от ноля строка, просто проверьте, если object == nil.

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

3
gnasher729

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

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

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

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

с макросом:

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

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

2
mgyky

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

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

или же

if ([data[@"Bonds"] isKindOfClass:[NSNull class]]) {
    NSLog(@"it is null");
}
2
Gami Nilesh
@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 = @"" OR NSString *strOne = @"StackOverflow" OR NSString *strOne = [NSNull null] OR NSString *strOne.

1
Hemang
if(textfield.text.length == 0){
   //do your desired work
}
1
Muhammad Aamir Ali

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

 if (text == nil)
1
Vineesh TP

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

@interface NSString (TrucBiduleChoseAdditions)

- (BOOL)isEmpty;

@end

@implementation NSString (TrucBiduleChoseAdditions)

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

@end
0
Rémy

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

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

0
JerryZhou

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

 if (mystring) 
 {
 if ([mystring isEqualToString: @ ""]) 
 {
 mystring = @ "некоторая строка"; 
} 
} 
 else 
 {
 //statements
}
0
Alen Alexander

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

0
Joseph Bolade Caxton-Idowu