web-dev-qa-db-ger.com

NSString ist leer

Wie testen Sie, ob ein NSString leer ist? oder alles Leerzeichen oder Null? mit einem einzigen Methodenaufruf?

34
Yazzmi

Sie können so etwas versuchen:

@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

Überprüfen Sie die Referenz " NSString " im ADC.

95
Jacob Relkin

Ich verwende eine Erweiterung zu 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;  
}
14
scooter133

Ich benutze, 

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

Ich hasse es, ein weiteres Protokoll zu diesem außergewöhnlich alten Feuer zu werfen, aber ich habe Angst, die Antwort einer anderen Person zu bearbeiten - vor allem, wenn es sich um die ausgewählte Antwort handelt.

Jacob stellte eine Anschlussfrage: Wie kann ich dies mit einem einzigen Methodenaufruf tun?

Die Antwort lautet, indem Sie eine Kategorie erstellen, die im Grunde die Funktionalität einer Objective-C-Basisklasse erweitert, und für alle anderen Codes eine Kurzform schreiben. 

Technisch gesehen ist eine Zeichenfolge mit Leerzeichen jedoch nicht leer - sie enthält nur keine sichtbaren Glyphen (in den letzten Jahren habe ich eine Methode namens isEmptyString verwendet: und heute konvertiert, nachdem ich diese Frage gelesen hatte. und Kommentarsatz).

Um eine Kategorie zu erstellen, gehen Sie zu Option + Klick -> Neue Datei ... (oder Datei -> Neu -> Datei ... oder einfach Befehlstaste + n) -> Wählen Sie Objective-C Category. Wählen Sie einen Namen für die Kategorie (dies hilft dem Namensraum und verringert mögliche zukünftige Konflikte) - Wählen Sie NSString aus der Dropdown-Liste "Kategorie" aus, und speichern Sie die Datei irgendwo. (Hinweis: Die Datei erhält automatisch den Namen NSString + YourCategoryName.h und .m.)

Ich persönlich schätze die selbstdokumentierende Natur von Objective-C; Daher habe ich auf NSString die folgende Kategoriemethode erstellt, die meine ursprüngliche isEmptyString: -Methode modifiziert und sich für eine passendere deklarierte Methode entschieden hat (ich vertraue darauf, dass der Compiler den Code später komprimiert - möglicherweise etwas zu viel).

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

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

Um die Methode aufzurufen, stellen Sie sicher, dass Sie die Datei NSString + MyCategoryName.h in die Klasse .h oder .m (ich ziehe die Klasse .m für Kategorien) vor, in der Sie diese Art der Überprüfung ausführen. Führen Sie die folgenden Schritte aus:

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

Hoffentlich umfasst das alle Grundlagen. Ich erinnere mich, als ich anfing, für Objective-C zu entwickeln, war die Kategorie etwas von diesen "huh?" Prüfungen für mich - aber jetzt benutze ich sie viel, um die Wiederverwendbarkeit zu erhöhen.

Edit: Und ich nehme an, technisch gesehen, wenn wir Charaktere streifen:

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

Ist wirklich alles, was benötigt wird (es sollte alles tun, was die Kategoriemethode tut, einschließlich der Kopie), aber ich könnte in dieser Hinsicht falsch sein.

4
Josh Bruce

Ich benutze diese Definition, da sie sowohl mit Null-Strings als auch mit leeren Strings funktioniert:

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

Eigentlich ist es jetzt so:

#define STR_EMPTY(str)  \
    (![str isKindOfClass:[NSString class]] || str.length == 0)
2
Cherpak Evgeny

Basierend auf der Antwort von Jacob Relkin und dem Kommentar von Jonathan:

@implementation TextUtils

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

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

        return NO;
    }

    @end
0
pvllnspk

Vielleicht kannst du so etwas versuchen:

+ (BOOL)stringIsEmpty:(NSString *)str
{
    return (str == nil) || (([str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]).length == 0);
}
0
liushuaikobe

Sollte einfacher sein:

if (![[string stringByReplacingOccurencesOfString:@" " withString:@""] length]) { NSLog(@"This string is empty"); }
0
MCKapur