Как проверить, является ли строка пустой в Objective C?

559

Как проверить, если в Objective C? < <20 > пусто?

Теги:
nsstring

28 ответов

1104
Лучший ответ

Вы можете проверить, есть ли [string length] == 0. Это проверит, является ли она допустимой, но пустой строкой (@""), а также если она равна нулю, так как вызов length на nil также вернет 0.

  • 12
    Есть некоторые очень редкие строки NSS, в которых это может привести к ложному отрицанию (например, строка не пуста, когда для практических целей она есть). Рассмотрим @"\u200B" (состоящий только из символа Unicode ZERO WIDTH SPACE . При его печати будет напечатано 0 символов (проверьте, используя моноширинный шрифт), но string.length выдаст 1. Существуют другие символы Unicode (например, OBJECT REPLACEMENT CHARACTER ), которые вести себя так же. Вы можете получить последнее при разборе PDF-текста.
  • 40
    @fzwo не быть задницей, но в теории это не дает ложного отрицания. Он ведет себя точно так, как вы ожидаете. Ваша интерпретация того, что такое ZERO WIDTH SPACE , на самом деле не имеет значения, потому что @"\u200B" - это символ, тем не менее, поэтому, если вы проверите, чтобы строка была пустой, она скажет, что это не потому, что в ней есть символ. Это просто не для печати в соответствии со стандартом Unicode.
Показать ещё 10 комментариев
125

Ответ Marc правильный. Но я воспользуюсь возможностью, чтобы включить указатель на Wil Shipley, обобщенный isEmpty, который он поделился с его blog:

static inline BOOL IsEmpty(id thing) {
return thing == nil
|| ([thing respondsToSelector:@selector(length)]
&& [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
&& [(NSArray *)thing count] == 0);
}
  • 25
    Если вы хотите, чтобы это было очень обобщенно, можно реализовать эту логику как категорию в NSObject вместо использования статического метода, как показано здесь.
  • 15
    Как ни странно, это на самом деле не проверяет [NSNull null].
Показать ещё 5 комментариев
94

Первый подход действителен, но не работает, если ваша строка имеет пробелы (@" "). Таким образом, вы должны очистить эти пробелы перед его тестированием.

Этот код очищает все пробелы с обеих сторон строки:

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

Одна хорошая идея - создать один макрос, поэтому вам не нужно набирать эту линию монстра:

#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]

Теперь вы можете использовать:

NSString *emptyString = @"   ";

if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");
  • 2
    Зачем использовать макросы, когда они не нужны? В этом случае безопасность любого типа приносится в жертву без реальной выгоды.
  • 0
    Это просто для удобства, если вам нравится писать «[object stringObject stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]» каждый раз, когда вы хотите проверить, пуста ли одна строка, решать вам.
Показать ещё 4 комментария
30

Одно из лучших решений, которое я когда-либо видел (лучше, чем у Matt G one), - это улучшенная встроенная функция, которую я взял на каком-то Git Hub repo (Wil Shipley one, но я не могу найти ссылку):

// Check if the "thing" pass'd is empty
static inline BOOL isEmpty(id thing) {
    return thing == nil
    || [thing isKindOfClass:[NSNull class]]
    || ([thing respondsToSelector:@selector(length)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [(NSArray *)thing count] == 0);
}
  • 2
    Это работа Уила Шипли. К вашему сведению, вы можете изменить [thing isKindOfClass: [NSNull class]] на просто (thing == [NSNull null])
  • 0
    Фу .... именно то, что я искал. Я сходил с ума, пытаясь понять, почему моя функция cellForRowAtIndexPath зависала из-за пустых строк (и я не мог уловить проблему). Эта функция решила это отлично.
Показать ещё 1 комментарий
14

Лучше использовать эту категорию:

@implementation NSString (Empty)

    - (BOOL) empty{
        return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]length] == 0);
    }

@end
  • 6
    Это определение будет заключаться в том, что строка "/ r / n / r / n" пуста, когда ее явно нет - она содержит пробелы. Ваша функция действительно: - (BOOL) isWhitespace (NSString *);
  • 5
    Следствие к этому. Я реализовал эту категорию, и есть поворот. Если вы вызываете это для нулевой строки, эта функция никогда не вызывается, и вы возвращаете NO (или то, что оценивается как NO) в качестве возвращаемого значения. Тогда вы думаете, что это не пусто ... Это может сработать, если имя было заполнено или что-то в этом роде.
Показать ещё 1 комментарий
12

Просто передайте строку следующему методу:

+(BOOL)isEmpty:(NSString *)str
{
    if(str.length==0 || [str isKindOfClass:[NSNull class]] || [str isEqualToString:@""]||[str  isEqualToString:NULL]||[str isEqualToString:@"(null)"]||str==nil || [str isEqualToString:@"<null>"]){
        return YES;
    }
    return NO;
}
  • 0
    Прочитайте комментарии на stackoverflow.com/questions/21605075/… чтобы узнать, почему это не так. Кроме того, как это лучше, чем другие ответы здесь.
12

Я положил это:

@implementation NSObject (AdditionalMethod)
-(BOOL) isNotEmpty
{
    return !(self == nil
    || [self isKindOfClass:[NSNull class]]
    || ([self respondsToSelector:@selector(length)]
        && [(NSData *)self length] == 0)
    || ([self respondsToSelector:@selector(count)]
        && [(NSArray *)self count] == 0));

};
@end

Проблема заключается в том, что если self равно nil, эта функция никогда не вызывается. Он вернет false, что желательно.

  • 0
    лучшее решение, так как a) это метод экземпляра и b) категория c) nil регистр сам по себе обрабатывается 'isNotEmpty' Thx!
  • 0
    Отличная идея, просто слишком плохо -(BOOL)isEmpty{ return ![self isNotEmpty]} не будет работать с категорией.
Показать ещё 1 комментарий
9

Другая опция - проверить, равно ли она @"" с isEqualToString: следующим образом:

if ([myString isEqualToString:@""]) {
    NSLog(@"myString IS empty!");
} else {
    NSLog(@"myString IS NOT empty, it is: %@", myString);
}
5

Быстрая версия

Хотя это вопрос Objective C, мне нужно было использовать NSString в Swift, поэтому я также включу здесь ответ.

let myNSString: NSString = ""

if myNSString.length == 0 {
    print("String is empty.")
}

Или, если NSString является необязательным:

var myOptionalNSString: NSString? = nil

if myOptionalNSString == nil || myOptionalNSString!.length == 0 {
    print("String is empty.")
}

// or alternatively...
if let myString = myOptionalNSString {
    if myString.length != 0 {
        print("String is not empty.")
    }
}

Нормальная версия Swift String

let myString: String = ""

if myString.isEmpty {
    print("String is empty.")
}

Смотрите также: Проверьте пустую строку в Swift?

5

У вас есть 2 способа проверить, является ли строка пустой или нет:

Предположим, что ваше имя строки NSString *strIsEmpty.

Метод 1:

if(strIsEmpty.length==0)
{
    //String is empty
}

else
{
    //String is not empty
}

Метод 2:

if([strIsEmpty isEqualToString:@""])
{
    //String is empty
}

else
{
    //String is not empty
}

Выберите любой из указанных выше методов и узнайте, пустая строка или нет.

5

Возможно, этот ответ является дубликатом уже предоставленных ответов, но я сделал несколько изменений и изменений в порядке проверки условий. Пожалуйста, используйте приведенный ниже код:

+(BOOL)isStringEmpty:(NSString *)str
    {
        if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
            return YES;
       }
        return NO;
    }
  • 0
    Это категория, вы можете посмотреть, как ее создать, здесь: goo.gl/bRcfn7 . Мне нравится идея категории для этого
  • 0
    Нет, мы не можем сказать, что это категория. Если эта функция реализована в категории класса NSString, то это категория. В противном случае мы можем вызвать этот метод с именем класса, где бы мы его не реализовали. Как Bool isEmptyStr = [MyClassName isStringEmpty: str] Но все же, будет лучше, если мы объявим его в категории. Потому что так или иначе нам нужно воспользоваться преимуществами категорий.
5

Просто используйте один из условий if else, как показано ниже:

Метод 1:

if ([yourString isEqualToString:@""]) {
        // yourString is empty.
    } else {
        // yourString has some text on it.
    }

Метод 2:

if ([yourString length] == 0) {
    // Empty yourString
} else {
    // yourString is not empty
}
4

Вы можете проверить, что ваша строка пуста или я не использую этот метод:

+(BOOL) isEmptyString : (NSString *)string
{
    if([string length] == 0 || [string isKindOfClass:[NSNull class]] || 
       [string isEqualToString:@""]||[string  isEqualToString:NULL]  ||
       string == nil)
     {
        return YES;         //IF String Is An Empty String
     }
    return NO;
}

Лучшей практикой является создание общего класса, называемого UtilityClass, и объявления этого метода, чтобы вы могли использовать этот метод, просто назовите его через свое приложение.

4

Очень полезная почта, чтобы добавить поддержку NSDictionary, а также небольшое небольшое изменение

static inline BOOL isEmpty(id thing) {
    return thing == nil
    || [thing isKindOfClass:[NSNull class]]
    || ([thing respondsToSelector:@selector(length)]
        && ![thing respondsToSelector:@selector(count)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [thing count] == 0);
}
  • 0
    Копия комментария @Brane: Если вы находитесь в ситуации, когда вы не знаете, какой тип объекта вы проверяете, я думаю, это работает. Однако я полагаю, что если вы не знаете, является ли объект NSData или NSDictionary, у вас есть большие проблемы. Каким будет ваш следующий макрос после этого вызова, condenseToSingleNSData(id thing) ? expandToNSArray(id thing) ? Рано или поздно вы будете спрашивать, с каким классом вы имеете дело, лучше сделать это при первом обращении.
3

Просто проверьте длину строки

 if (!yourString.length)
 {
   //your code  
 }

сообщение NIL вернет nil или 0, поэтому нет необходимости тестировать nil:).

Счастливое кодирование...

  • 0
    Я использовал это так много раз. Абсолютно не нужно расширений, категорий и чего нет.
2

Лучше всего использовать категорию.
Вы можете проверить следующую функцию. У которого есть все условия для проверки.

-(BOOL)isNullString:(NSString *)aStr{
        if([(NSNull *)aStr isKindOfClass:[NSNull class]]){
            return YES;
        }
        if ((NSNull *)aStr  == [NSNull null]) {
            return YES;
        }
        if ([aStr isKindOfClass:[NSNull class]]){
            return YES;
        }
        if(![[aStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]){
            return YES;
        }
        return NO;
    }
2
- (BOOL)isEmpty:(NSString *)string{
    if ((NSNull *) string == [NSNull null]) {
        return YES;
    }
    if (string == nil) {
        return YES;
    }
    if ([string length] == 0) {
        return YES;
    }
    if ([[string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0) {
        return YES;
    }
    if([[string stringByStrippingWhitespace] isEqualToString:@""]){
        return YES;
    }
    return NO;
}
  • 1
    Первые три условия являются избыточными, и вы не включили источник для stringByStrippingWhitespace
2

Поэтому, помимо базовой концепции проверки длины строки менее 1, важно глубоко рассмотреть контекст.  Языки человека или компьютер или другие могут иметь разные определения пустых строк и на тех же языках, дополнительный контекст может дополнительно изменить смысл.

Пусть говорят, что пустая строка означает "строка, которая не содержит символов, значимых в текущем контексте".

Это может означать визуально, так как цвет и цвет фона одинаковы в атрибутной строке. Эффективно пуст.

Это может означать пустые значащие символы. Все точки или все тире или все подчеркивания могут считаться пустыми. Кроме того, пустые значащие значащие символы могут означать строку, которая не имеет символов, которые понимает читатель. Они могут быть символами на языке или characterSet, которые для читателя не имеют смысла. Мы могли бы определить это несколько иначе, чтобы сказать, что строка не содержит известных слов на данном языке.

Можно сказать, что пустое является функцией процента отрицательного пространства в отображаемых глифах.

Даже последовательность непечатаемых символов без общего визуального представления не является действительно пустой. Управляющие символы приходят на ум. Особенно низкий диапазон ASCII (я удивлен, что никто не упоминал об этом, поскольку они шлепают множество систем и не являются пробелами, поскольку у них обычно нет глифов и нет визуальных показателей). Но длина строки не равна нулю.

Заключение. Здесь не единственная мера. Членство в контекстном наборе также очень важно.

Назначение набора символов - очень важная общая дополнительная мера. Значимые последовательности также довольно распространенные. (думаю, SETI или крипто или капча) Существуют также дополнительные абстрактные контекстные множества.

Поэтому тщательно подумайте, прежде чем предполагать, что строка пуста только по длине или пробелу.

2

Он работает как прелесть для меня

Если NSString - s

if ([s isKindOfClass:[NSNull class]] || s == nil || [s isEqualToString:@""]) {

    NSLog(@"s is empty");

} else {

    NSLog(@"s containing %@", s);

}
1
//Different validations:
 NSString * inputStr = @"Hey ";

//Check length
[inputStr length]

//Coming from server, check if its NSNull
[inputStr isEqual:[NSNull null]] ? nil : inputStr

//For validation in allowed character set
-(BOOL)validateString:(NSString*)inputStr
{
    BOOL isValid = NO;
    if(!([inputStr length]>0))
    {
        return isValid;

    }

    NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet characterSetWithCharactersInString:@".-"];
    [allowedSet formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]];
    if ([inputStr rangeOfCharacterFromSet:[allowedSet invertedSet]].location == NSNotFound)
    {
        // contains only decimal set and '-' and '.'

    }
    else
    {
        // invalid
        isValid = NO;

    }
    return isValid;
}
1

Его так же просто, как if([myString isEqual:@""]) или if([myString isEqualToString:@""])

1

Я проверил пустую строку, используя код ниже:

//Check if we have any search terms in the search dictionary.
if( (strMyString.text==(id) [NSNull null] || [strMyString.text length]==0 
       || strMyString.text isEqual:@"")) {

   [AlertView showAlert:@"Please enter a valid string"];  
}
1

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

if ([yourstring isEqualToString:@""]) {
    // execute your action here if string is empty
}
1

проверьте это:

if ([yourString isEqualToString:@""])
{
    NsLog(@"Blank String");
}

или

if ([yourString length] == 0)
{
    NsLog(@"Blank String");
}

Надеюсь, это поможет.

1
if (string.length == 0) stringIsEmpty;
1

Лучший способ в любом случае - проверить длину данной строки. Для этого, если ваша строка - myString, тогда код:

    int len = [myString length];
    if(len == 0){
       NSLog(@"String is empty");
    }
    else{
      NSLog(@"String is : %@", myString);
    }
0
if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
    NSLog(@"String is empty");
}
else{
    NSLog(@"String is not empty");
}    
  • 1
    Нулевая проверка должна быть первой. str.length вызовет исключение, если str равен нулю.
0
if( [txtMobile.text length] == 0 )
{
    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню