NSString пусто - PullRequest
       12

NSString пусто

35 голосов
/ 09 августа 2010

Как проверить, пуста ли строка NSString? или все пробелы или ноль? с одним вызовом метода?

Ответы [ 8 ]

95 голосов
/ 09 августа 2010

Вы можете попробовать что-то вроде этого:

@implementation NSString (JRAdditions)

+ (BOOL)isStringEmpty:(NSString *)string {
   if([string length] == 0) { //string is empty or nil
       return YES;
   } 

   if(![[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]) {
       //string is all whitespace
       return YES;
   }

   return NO;
}

@end

Проверьте ссылку NSString на АЦП.

14 голосов
/ 21 февраля 2012

Это то, что я использую, Расширение NSString:

+ (BOOL)isEmptyString:(NSString *)string;
// Returns YES if the string is nil or equal to @""
{
    // Note that [string length] == 0 can be false when [string isEqualToString:@""] is true, because these are Unicode strings.

    if (((NSNull *) string == [NSNull null]) || (string == nil) ) {
        return YES;
    }
    string = [string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

    if ([string isEqualToString:@""]) {
        return YES;
    }

    return NO;  
}
7 голосов
/ 05 ноября 2011

использую,

+ (BOOL ) stringIsEmpty:(NSString *) aString {

    if ((NSNull *) aString == [NSNull null]) {
        return YES;
    }

    if (aString == nil) {
        return YES;
    } else if ([aString length] == 0) {
        return YES;
    } else {
        aString = [aString stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        if ([aString length] == 0) {
            return YES;
        }
    }

    return NO;  
}

+ (BOOL ) stringIsEmpty:(NSString *) aString shouldCleanWhiteSpace:(BOOL)cleanWhileSpace {

    if ((NSNull *) aString == [NSNull null]) {
        return YES;
    }

    if (aString == nil) {
        return YES;
    } else if ([aString length] == 0) {
        return YES;
    } 

    if (cleanWhileSpace) {
        aString = [aString stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        if ([aString length] == 0) {
            return YES;
        }
    }

    return NO;  
}
4 голосов
/ 16 августа 2013

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

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

Ответ заключается в создании категории, которая в основном расширяет функциональные возможности базового класса Objective-C, и написании «сокращенного» метода для всего остального кода.

Однако, технически, строка с символами пробела не является пустой - она ​​просто не содержит видимых глифов (последние пару лет я использовал метод isEmptyString: и преобразован сегодня после прочтения этого вопроса , ответ и набор комментариев).

Чтобы создать категорию, перейдите к Option + Click -> New File ... (или File -> New -> File ... или просто команда + n) -> выберите Objective-C Category. Выберите имя для категории (это поможет пространству имен и уменьшит возможные будущие конфликты) - выберите NSString из выпадающего списка «Категория вкл.» - сохраните файл где-нибудь. (Примечание. Файл будет автоматически называться NSString + YourCategoryName.h и .m.)

Я лично ценю самодокументированную природу Objective-C; поэтому я создал следующий метод категории для NSString, изменив мой исходный метод isEmptyString: метод и выбрав более точно объявленный метод (я верю, что компилятор сожмет код позже - возможно, слишком много).

Заголовок (.h):

#import <Foundation/Foundation.h>

@interface NSString (YourCategoryName)

/*! Strips the string of white space characters (inlcuding new line characters).
 @param string NSString object to be tested - if passed nil or @"" return will
     be negative
 @return BOOL if modified string length is greater than 0, returns YES; 
 otherwise, returns NO */
+ (BOOL)visibleGlyphsExistInString:(NSString *)string;

@end

Реализация (.m):

@implementation NSString (YourCategoryName)

+ (BOOL)visibleGlyphsExistInString:(NSString *)string
{
    // copying string should ensure retain count does not increase
    // it was a recommendation I saw somewhere (I think on stack),
    // made sense, but not sure if still necessary/recommended with ARC
    NSString *copy = [string copy];

    // assume the string has visible glyphs
    BOOL visibleGlyphsExist = YES;
    if (
        copy == nil
        || copy.length == 0
        || [[copy stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0
        ) {
        // if the string is nil, no visible characters would exist
        // if the string length is 0, no visible characters would exist
        // and, of course, if the length after stripping the white space
        // is 0, the string contains no visible glyphs
        visibleGlyphsExist = NO;

    }
    return visibleGlyphsExist;

}

@end

Чтобы вызвать метод, обязательно #import файла NSString + MyCategoryName.h в класс .h или .m (я предпочитаю .m для категорий), где вы выполняете этот вид проверки и выполните следующее:

NSString* myString = @""; // or nil, or tabs, or spaces, or something else
BOOL hasGlyphs = [NSString visibleGlyphsExistInString:myString];

Надеюсь, это охватывает все основы. Я помню, когда я впервые начал разрабатывать для Objective-C, категория была одной из тех, "а?" испытания для меня - но теперь я использую их немного, чтобы увеличить возможность повторного использования.

Редактировать: И я полагаю, технически, если мы раздеваем персонажей, это:

[[copy stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0

Это действительно все, что нужно (он должен делать все, что делает метод категории, включая копию), но я могу ошибаться в этом отношении.

2 голосов
/ 08 июля 2013

Я использую это определение, так как оно работает со строками nil и пустыми строками:

#define STR_EMPTY(str)  \
    str.length == 0

На самом деле теперь это так:

#define STR_EMPTY(str)  \
    (![str isKindOfClass:[NSString class]] || str.length == 0)
0 голосов
/ 19 ноября 2014

Может быть, вы можете попробовать что-то вроде этого:

+ (BOOL)stringIsEmpty:(NSString *)str
{
    return (str == nil) || (([str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]).length == 0);
}
0 голосов
/ 16 августа 2013

должно быть проще:

if (![[string stringByReplacingOccurencesOfString:@" " withString:@""] length]) { NSLog(@"This string is empty"); }
0 голосов
/ 10 августа 2013

На основании ответа Джейкоба Релкина и комментария Джонатана:

@implementation TextUtils

    + (BOOL)isEmpty:(NSString*) string {

        if([string length] == 0 || ![[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]) {
            return YES;
        }

        return NO;
    }

    @end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...