NSString is empty

前端 未结 8 1848
伪装坚强ぢ
伪装坚强ぢ 2021-01-30 05:45

How do you test if an NSString is empty? or all whitespace or nil? with a single method call?

相关标签:
8条回答
  • 2021-01-30 05:51

    I use,

    + (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;  
    }
    
    0 讨论(0)
  • 2021-01-30 05:54

    Based on the Jacob Relkin answer and Jonathan comment:

    @implementation TextUtils
    
        + (BOOL)isEmpty:(NSString*) string {
    
            if([string length] == 0 || ![[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]) {
                return YES;
            }
    
            return NO;
        }
    
        @end
    
    0 讨论(0)
  • 2021-01-30 05:56

    Maybe you can try something like this:

    + (BOOL)stringIsEmpty:(NSString *)str
    {
        return (str == nil) || (([str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]).length == 0);
    }
    
    0 讨论(0)
  • 2021-01-30 05:58

    I'm using this define as it works with nil strings as well as empty strings:

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

    Actually now its like this:

    #define STR_EMPTY(str)  \
        (![str isKindOfClass:[NSString class]] || str.length == 0)
    
    0 讨论(0)
  • 2021-01-30 05:59

    I hate to throw another log on this exceptionally old fire, but I'm leery about editing someone else's answer - especially when it's the selected answer.

    Jacob asked a follow up question: How can I do this with a single method call?

    The answer is, by creating a category - which basically extends the functionality of a base Objective-C class - and writing a "shorthand" method for all the other code.

    However, technically, a string with white space characters is not empty - it just doesn't contain any visible glyphs (for the last couple of years I've been using a method called isEmptyString: and converted today after reading this question, answer, and comment set).

    To create a category go to Option+Click -> New File... (or File -> New -> File... or just command+n) -> choose Objective-C Category. Pick a name for the category (this will help namespace it and reduce possible future conflicts) - choose NSString from the "Category on" drop down - save the file somewhere. (Note: The file will automatically be named NSString+YourCategoryName.h and .m.)

    I personally appreciate the self-documenting nature of Objective-C; therefore, I have created the following category method on NSString modifying my original isEmptyString: method and opting for a more aptly declared method (I trust the compiler to compress the code later - maybe a little too much).

    Header (.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
    

    Implementation (.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
    

    To call the method be sure to #import the NSString+MyCategoryName.h file into the .h or .m (I prefer the .m for categories) class where you are running this sort of validation and do the following:

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

    Hopefully that covers all the bases. I remember when I first started developing for Objective-C the category thing was one of those "huh?" ordeals for me - but now I use them quite a bit to increase reusability.

    Edit: And I suppose, technically, if we're stripping characters, this:

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

    Is really all that is needed (it should do everything that category method does, including the copy), but I could be wrong on that score.

    0 讨论(0)
  • 2021-01-30 06:02

    Should be easier:

    if (![[string stringByReplacingOccurencesOfString:@" " withString:@""] length]) { NSLog(@"This string is empty"); }
    
    0 讨论(0)
提交回复
热议问题