Как проверить, является ли строка пустой в 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!");
Команда разработчиков SEQOY
источник
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, эта функция никогда не вызывается. Он вернет ложь, что желательно.

user4951
источник
лучшее решение, так как 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;
}
Mani
источник
Прочитайте комментарии на 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?

Suragch
источник
5

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

+(BOOL)isStringEmpty:(NSString *)str
    {
        if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
            return YES;
       }
        return NO;
    }
iDevAmit
источник
Это категория, вы можете посмотреть, как ее создать, здесь: 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);

}
MaxEcho
источник
2

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

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

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

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

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

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

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

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

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

uchuugaka
источник
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;
}
Ptbaileys
источник
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;
    }
Tarun
источник
1

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

    int len = [myString length];
    if(len == 0){
       NSLog(@"String is empty");
    }
    else{
      NSLog(@"String is : %@", myString);
    }
AJS
источник
1

Проверь это :

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

Или

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

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

Mayur
источник
1

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

if ([yourstring isEqualToString:@""]) {
    // execute your action here if string is empty
}
user3213914
источник
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([myString isEqual:@""])илиif([myString isEqualToString:@""])

Ахсан Эбрахим
источник
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");
}    
C_compnay
источник
1
Нулевая проверка должна быть первой. str.lengthвыдаст исключение, если strноль.
Джеффри Томас
-2
if( [txtMobile.text length] == 0 )
{
    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
Мохсин Сабасара
источник