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


Ответы:


1156

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


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

43
@fzwo не быть задницей, но в теории это не дает ложного отрицания. Он ведет себя точно так, как вы ожидаете. Ваша интерпретация того, что ZERO WIDTH SPACEна самом деле не имеет значения, потому что, тем не менее , @"\u200B" является символом, поэтому, если вы проверите, чтобы строка была пустой, она скажет, что это не потому, что в ней есть символ. Это просто не для печати в соответствии со стандартом Unicode.
bmeulmeester

2
Конечно, это технически правильно, я не обсуждаю это. Я просто хочу предупредить, что это может не демонстрировать предполагаемое или ожидаемое поведение, поэтому я написал «для практических целей». Это зависит от предполагаемого значения «пустой».
fzwo

4
Это не ложный минус. «Пробел с нулевой стоимостью» - это символ Юникода, как и любой другой. Это просто "стоит помнить", если оно имеет отношение к вашему приложению. (Отличное мышление, fzwo!)
Толстяк

2
Дай мне знать , если я ошибаюсь, но я думаю , что вы могли бы опустить == 0 части и добавить отрицание перед: ![string length]. Кажется более чистым.
damirstuhec

126

Марк отвечает правильно. Но я воспользуюсь этой возможностью, чтобы включить указатель на обобщение Уила Шипли isEmpty, которым он поделился в своем блоге :

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

26
Если вы хотите, чтобы это было очень обобщенно, можно реализовать эту логику как категорию в NSObject вместо использования статического метода, как показано здесь.
Брэд App Guy

16
Как ни странно, это на самом деле не проверяет [NSNull null].
Питер Н Льюис

14
Если вы находитесь в ситуации, когда вы не знаете, какой тип объекта вы проверяете, я думаю, это работает. Однако я полагаю, что если вы не знаете, является ли объект NSData или NSArray, у вас есть большие проблемы. Каким будет ваш следующий макрос после этого вызова, ConseseToSingleNSData (идентификатор)? expandToNSArray (идентификатор вещи)? Рано или поздно вы будете спрашивать, с каким классом вы имеете дело, лучше сделать это при первом обращении.
Брейн

1
@BradSmith, для него можно создать категорию, но значения nil не будут учитываться, поскольку метод не будет вызываться. Например, если thing = nil, [thing IsEmpty] не будет вызван и всегда будет возвращать false / NO. Чтобы проверить на ноль, должен быть параметр. Нулевые объекты не могут сравнивать себя как ноль через категорию.
Крис

3
@ Крис, тогда вы можете изменить метод категории на -isNotEmpty:)
nielsbot

93

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

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

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

Хорошая идея - создать один макрос, поэтому вам не нужно вводить эту строку монстра:

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

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

NSString *emptyString = @"   ";

if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");

3
Зачем использовать макросы, когда они не нужны? В этом случае безопасность любого типа приносится в жертву без реальной выгоды.
EM

Это просто для удобства, если вам нравится писать «[object stringObject stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]» каждый раз, когда вы хотите проверить, пуста ли одна строка, решать вам.
Команда разработчиков SEQOY

18
это будет лучше обслуживать NSStringкатегорией, которая добавляет метод с именем, trimmedStringкоторый делает именно то, что вы написали.
Дэйв Делонг

2
Обратите внимание, что в Apple whitespaceCharacterSetнет новых строк! Вот категория, которую я написал, включая trimнекоторые другие полезные методы: github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/…
AlexChaffee

@EM Я не фанат макросов, но я не понимаю твоей заботы о безопасности типов. Во время компиляции макрос заменяется его содержимым, поэтому, если вы вызываете макрос с чем-то отличным от строки NSSt, вы все равно получаете сообщение от компилятора. Категории были бы намного лучше в любом случае.
Zmaster

32

Одно из лучших решений, которое я когда-либо видел (лучше, чем у Мэтта Дж), - это улучшенная встроенная функция, которую я использовал в репозитории Git Hub (Уил Шипли, но я не могу найти ссылку):

// Check if the "thing" passed 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
Это работа Уила Шипли. К вашему сведению, вы можете изменить [вещь isKindOfClass: [NSNull класс]] на просто (вещь == [NSNull null])
Стив N

Фу .... именно то, что я искал. Я сходил с ума, пытаясь понять, почему моя функция «cellForRowAtIndexPath» зависала из-за пустых строк (и я не мог уловить проблему). Эта функция решила это отлично.
Майк Гледхилл

Копия комментария @Brane: Если вы находитесь в ситуации, когда вы не знаете, какой тип объекта вы проверяете, я думаю, это работает. Однако я полагаю, что если вы не знаете, является ли объект NSData или NSArray, у вас есть большие проблемы. Каким будет ваш следующий макрос после этого звонка condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Рано или поздно вы будете спрашивать, с каким классом вы имеете дело, лучше сделать это при первом обращении.
Cœur

16

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

@implementation NSString (Empty)

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

@end

6
Это определение будет заключаться в том, что строка "/ r / n / r / n" пуста, когда ее явно нет - она ​​содержит пробелы. Ваша функция действительно: - (BOOL) isWhitespace (NSString *);
JBRWilkinson

6
Следствие к этому. Я реализовал эту категорию, и есть поворот. Если вы вызываете это для нулевой строки, эта функция никогда не вызывается, и вы возвращаете NO (или то, что оценивается как NO) в качестве возвращаемого значения. Тогда вы думаете, что это не пусто ... Это может сработать, если имя было заполнено или что-то в этом роде.
Ин

Я думаю, правильная категория была бы: @implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end как комбинация ответа Марка и Кайла.
Palme

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, эта функция никогда не вызывается. Он вернет ложь, что желательно.


лучшее решение, так как a) это метод экземпляра и b) категория c) nil регистр сам по себе обрабатывается 'isNotEmpty' Thx!
Денис

Отличная идея, просто слишком плохо -(BOOL)isEmpty{ return ![self isNotEmpty]}не будет работать на категории.
Олстон

Копия комментария @Brane: Если вы находитесь в ситуации, когда вы не знаете, какой тип объекта вы проверяете, я думаю, это работает. Однако я полагаю, что если вы не знаете, является ли объект NSData или NSArray, у вас есть большие проблемы. Каким будет ваш следующий макрос после этого звонка condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Рано или поздно вы будете спрашивать, с каким классом вы имеете дело, лучше сделать это при первом обращении.
Cœur

11

Другой вариант заключается в проверке , если она равна @""с isEqualToString:примерно так:

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

11

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

+(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;
}

Прочитайте комментарии на stackoverflow.com/questions/21605075/… чтобы узнать, почему это не так. Кроме того, как это лучше, чем другие ответы здесь.
Popeye

6

Просто используйте один из 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
}

6

Swift Version

Несмотря на то, что это вопрос по 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.")
    }
}

Обычная Stringверсия Swift

let myString: String = ""

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

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


5

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

+(BOOL)isStringEmpty:(NSString *)str
    {
        if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
            return YES;
       }
        return NO;
    }

Это категория, вы можете посмотреть, как ее создать, здесь: goo.gl/bRcfn7 . Мне нравится идея категории для этого
Даниэль Гомес Рико

Нет, мы не можем сказать, что это категория. Если эта функция реализована в категории класса NSString, то это категория. В противном случае мы можем вызвать этот метод с именем класса, где бы мы его не реализовали. Как Bool isEmptyStr = [MyClassName isStringEmpty: str] Но все же, будет лучше, если мы объявим его в категории. Потому что так или иначе нам нужно воспользоваться преимуществами категорий.
iDevAmit

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

У вас есть 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
}

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


3

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

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

сообщение NIL вернет ноль или 0, так что нет необходимости проверять ноль :).

Удачного кодирования ...


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

2

Это работает как шарм для меня

Если NSStringэтоs

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

    NSLog(@"s is empty");

} else {

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

}

2

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

Допустим, пустая строка означает «строку, которая не содержит символов, значимых в текущем контексте».

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

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

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

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

Вывод. Только длина не единственная мера здесь. Контекстное членство в наборе также очень важно.

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

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


2

Очень полезный пост, чтобы добавить поддержку 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);
}

Копия комментария @Brane: Если вы находитесь в ситуации, когда вы не знаете, какой тип объекта вы проверяете, я думаю, это работает. Однако я полагаю, что если вы не знаете, является ли объект NSData или NSDictionary, у вас есть большие проблемы. Каким будет ваш следующий макрос после этого звонка condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Рано или поздно вы будете спрашивать, с каким классом вы имеете дело, лучше сделать это при первом обращении.
Cœur

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
mattsven

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;
    }

1

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

    int len = [myString length];
    if(len == 0){
       NSLog(@"String is empty");
    }
    else{
      NSLog(@"String is : %@", myString);
    }


1

Проверь это :

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

Или

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

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


1

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

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

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
//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;
}

0

Вы можете получить пустую строку двумя способами:

1) @ "" // Не содержит пробела

2) @ "" // Содержит пространство

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

if ([firstNameTF.text stringByReplacingOccurrencesOfString:@" " withString:@""].length==0)
{
    NSLog(@"Empty String");
}
else
{
    NSLog(@"String contains some value");
}

0

Попробуйте следующее

NSString *stringToCheck = @"";

if ([stringToCheck isEqualToString:@""])
{
   NSLog(@"String Empty");
}
else
{
   NSLog(@"String Not Empty");
}

-1
if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
    NSLog(@"String is empty");
}
else{
    NSLog(@"String is not empty");
}    

1
Нулевая проверка должна быть первой. str.lengthвыдаст исключение, если strноль.
Джеффри Томас

-2
if( [txtMobile.text length] == 0 )
{
    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.