Wie teste ich, ob eine Zeichenfolge in Objective-C leer ist?


Antworten:


1156

Sie können überprüfen, ob [string length] == 0. Dies prüft, ob es sich um eine gültige, aber leere Zeichenfolge (@ "") handelt und ob es sich um Null handelt, da der Aufruf lengthvon Null ebenfalls 0 zurückgibt.


12
Es gibt einige sehr seltene NSStrings, bei denen dies zu einem falsch negativen Ergebnis führt (wenn die Zeichenfolge aus praktischen Gründen nicht leer ist). Berücksichtigen Sie @"\u200B"(besteht nur aus dem Unicode-Zeichen ZERO WIDTH SPACE . Wenn Sie es ausdrucken, werden 0 Zeichen gedruckt (überprüfen Sie dies mit monospaced Schriftart), aber string.length ergibt 1. Es gibt andere Unicode-Zeichen (wie OBJECT REPLACEMENT CHARACTER ), die sich ebenfalls verhalten
Holen Sie

43
@fzwo kein Arsch zu sein, aber theoretisch gibt es kein falsches Negativ. Es verhält sich genau so, wie Sie es erwarten würden. Ihre Interpretation dessen, was ZERO WIDTH SPACEist, spielt keine Rolle, da @"\u200B" es sich dennoch um ein Zeichen handelt. Wenn Sie also testen, ob die Zeichenfolge leer ist, wird dies nicht darauf zurückzuführen sein, dass sich ein Zeichen darin befindet. Es kann einfach nicht nach dem Unicode-Standard gedruckt werden.
Bmeulmeester

2
Natürlich ist es technisch korrekt, darüber diskutiere ich nicht. Ich möchte nur darauf hinweisen, dass dies möglicherweise nicht das beabsichtigte oder erwartete Verhalten aufweist, weshalb ich "aus praktischen Gründen" geschrieben habe. Es hängt von der beabsichtigten Bedeutung von "leer" ab.
Zwei

4
Es ist kein falsches Negativ. Ein "Nullwert-Leerzeichen" ist ein Unicode-Zeichen wie jedes andere. Es lohnt sich nur, sich daran zu erinnern, wenn dies für Ihre App relevant ist. (Großartiges Denken, fzwo!)
Fattie

2
Lassen Sie mich wissen, wenn ich falsch liege, aber ich denke, Sie könnten auch == 0 Teil weglassen und eine Negation davor hinzufügen : ![string length]. Scheint sauberer.
Damirstuhec

126

Marc's Antwort ist richtig. Aber ich werde diese Gelegenheit nutzen, um einen Hinweis auf Wil Shipleys Verallgemeinerung aufzunehmen isEmpty, den er in seinem Blog geteilt hat :

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
Wenn Sie möchten, dass dies sehr verallgemeinert ist, können Sie diese Logik als Kategorie in NSObject implementieren, anstatt eine statische Methode wie hier gezeigt zu verwenden.
Brad The App Guy

16
Seltsamerweise wird hierdurch nicht nach [NSNull null] gesucht.
Peter N Lewis

14
Wenn Sie sich in einer Situation befinden, in der Sie nicht wissen, welche Art von Objekt Sie überprüfen, funktioniert dies vermutlich. Ich schlage jedoch vor, dass Sie größere Probleme haben, wenn Sie nicht wissen, ob es sich bei einem Objekt um NSData oder NSArray handelt. Was ist Ihr nächstes Makro nach diesem Aufruf, condenseToSingleNSData (id thing)? expandToNSArray (ID-Sache)? Früher oder später werden Sie sich fragen, mit welcher Art von Klasse Sie es zu tun haben, besser, wenn Sie dies zuerst tun.
Brane

1
@BradSmith, man könnte eine Kategorie dafür erstellen, aber Nullwerte würden nicht gezählt, da die Methode nicht aufgerufen würde. Wenn beispielsweise thing = nil ist, wird [thing IsEmpty] nicht aufgerufen und gibt immer false / NO zurück. Um auf Null zu prüfen, muss ein Parameter vorhanden sein. Null-Objekte können sich nicht über eine Kategorie als Null vergleichen.
Chris

3
@chris dann können Sie die Kategoriemethode zu ändern -isNotEmpty:)
Nielsbot

93

Der erste Ansatz ist gültig, funktioniert jedoch nicht, wenn Ihre Zeichenfolge Leerzeichen enthält ( @" "). Sie müssen diese Leerzeichen also löschen, bevor Sie sie testen.

Dieser Code löscht alle Leerzeichen auf beiden Seiten der Zeichenfolge:

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

Eine gute Idee ist es, ein Makro zu erstellen, damit Sie diese Monsterzeile nicht eingeben müssen:

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

Jetzt können Sie verwenden:

NSString *emptyString = @"   ";

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

3
Warum Makros verwenden, wenn sie nicht benötigt werden? In diesem Fall wird jede Art von Sicherheit ohne wirklichen Nutzen geopfert.
EM

Wenn Sie "[object stringObject stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]" schreiben möchten, liegt es ganz bei Ihnen, wann immer Sie überprüfen möchten, ob eine Zeichenfolge leer ist.
SEQOY Entwicklungsteam

18
Das sollte besser von einer NSStringKategorie bedient werden, die eine Methode namens hinzufügt trimmedString, die genau das tut, was Sie geschrieben haben.
Dave DeLong

2
Beachten Sie, dass Apple whitespaceCharacterSetkeine Zeilenumbrüche enthält! Hier ist eine Kategorie, die ich geschrieben habe, einschließlich trimeiniger anderer nützlicher Methoden: github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/…
AlexChaffee

@EM Ich bin kein Fan von Makros, aber ich verstehe Ihre Bedenken hinsichtlich der Typensicherheit nicht. Während der Kompilierung wird das Makro durch seinen Inhalt ersetzt. Wenn Sie das Makro mit etwas anderem als einem NSString aufrufen, erhalten Sie dennoch eine Nachricht vom Compiler. Kategorien wären sowieso viel besser.
Zmaster

32

Eine der besten Lösungen, die ich je gesehen habe (besser als die von Matt G), ist diese verbesserte Inline-Funktion, die ich bei einem Git Hub-Repo (Wil Shipleys, aber ich kann den Link nicht finden) übernommen habe:

// 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
Dies ist Wil Shipleys Arbeit. Zu Ihrer Information, Sie können [thing isKindOfClass: [NSNull class]] in just (thing == [NSNull null]) ändern
Steve N

Puh ... genau das, wonach ich gesucht habe. Ich wurde verrückt und versuchte herauszufinden, warum meine Funktion "cellForRowAtIndexPath" aufgrund von Nullzeichenfolgen abstürzte (und ich konnte das Problem nicht erkennen). Diese Funktion hat es perfekt gelöst.
Mike Gledhill

Kopie des @ Brane-Kommentars: Wenn Sie sich in einer Situation befinden, in der Sie nicht wissen, welchen Objekttyp Sie überprüfen, funktioniert dies vermutlich. Ich schlage jedoch vor, dass Sie größere Probleme haben, wenn Sie nicht wissen, ob es sich bei einem Objekt um NSData oder NSArray handelt. Was ist Ihr nächstes Makro nach diesem Aufruf condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Früher oder später werden Sie sich fragen, mit welcher Art von Klasse Sie es zu tun haben, besser, wenn Sie dies zuerst tun.
Cœur

16

Sie sollten diese Kategorie besser verwenden:

@implementation NSString (Empty)

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

@end

6
Diese Definition würde bedeuten, dass die Zeichenfolge "/ r / n / r / n" leer ist, wenn dies eindeutig nicht der Fall ist - sie enthält Leerzeichen. Ihre Funktion ist wirklich: - (BOOL) isWhitespace (NSString *);
JBRWilkinson

6
Eine Folge davon. Ich habe diese Kategorie implementiert, und es gibt eine Wendung. Wenn Sie dies für eine Null-Zeichenfolge aufrufen, wird diese Funktion niemals aufgerufen, und Sie erhalten ein NEIN (oder was als NEIN ausgewertet wird) als Rückgabewert zurück. Dann denkst du, es ist nicht leer ... Dies könnte funktionieren, wenn der Name "Gefüllt" oder so ähnlich war.
Ying

Ich denke, die richtige Kategorie wäre dann: @implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end Als Kombination aus Marc's und Kyles Antwort.
Palme

12

Ich sage das:

@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

Das Problem ist, dass diese Funktion niemals aufgerufen wird, wenn self null ist. Es wird false zurückgegeben, was erwünscht ist.


beste Lösung, da a) Instanzmethode ist und b) Kategorie c) kein Fall für sich selbst von 'isNotEmpty' behandelt wird Thx!
Denis

Tolle Idee, nur schade, dass -(BOOL)isEmpty{ return ![self isNotEmpty]}die Kategorie nicht funktioniert.
Alston

Kopie des @ Brane-Kommentars: Wenn Sie sich in einer Situation befinden, in der Sie nicht wissen, welchen Objekttyp Sie überprüfen, funktioniert dies vermutlich. Ich schlage jedoch vor, dass Sie größere Probleme haben, wenn Sie nicht wissen, ob es sich bei einem Objekt um NSData oder NSArray handelt. Was ist Ihr nächstes Makro nach diesem Aufruf condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Früher oder später werden Sie sich fragen, mit welcher Art von Klasse Sie es zu tun haben, besser, wenn Sie dies zuerst tun.
Cœur

11

Eine andere Möglichkeit besteht darin, zu überprüfen, ob es @""mit isEqualToString:like so gleich ist:

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

11

Übergeben Sie einfach Ihren String an folgende Methode:

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

Lesen Sie in den Kommentaren auf stackoverflow.com/questions/21605075/… nach, warum dies falsch ist. Auch wie ist das besser als die anderen Antworten hier.
Popeye

6

Verwenden Sie einfach eine der folgenden if elseBedingungen:

Methode 1:

if ([yourString isEqualToString:@""]) {
        // yourString is empty.
    } else {
        // yourString has some text on it.
    }

Methode 2:

if ([yourString length] == 0) {
    // Empty yourString
} else {
    // yourString is not empty
}

6

Schnelle Version

Obwohl dies eine objektive C-Frage ist, musste ich sie NSStringin Swift verwenden, damit ich hier auch eine Antwort einfügen kann.

let myNSString: NSString = ""

if myNSString.length == 0 {
    print("String is empty.")
}

Oder wenn NSStringist eine Option:

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.")
    }
}

Die normale Swift- StringVersion ist

let myString: String = ""

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

Siehe auch: Leere Zeichenfolge in Swift prüfen?


5

Vielleicht ist diese Antwort das Duplikat der bereits gegebenen Antworten, aber ich habe nur wenige Modifikationen und Änderungen in der Reihenfolge der Überprüfung der Bedingungen vorgenommen. Bitte beachten Sie den folgenden Code:

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

Dies ist eine Kategorie, die Sie hier erstellen können: goo.gl/bRcfn7 . Ich mag die Idee einer Kategorie dafür
Daniel Gomez Rico

Nein, wir können nicht sagen, dass dies eine Kategorie ist. Wenn diese Funktion unter der Kategorie der NSString-Klasse implementiert ist, handelt es sich um eine Kategorie. Andernfalls können wir diese Methode mit dem Namen der Klasse aufrufen, wo immer wir sie implementiert haben. Wie Bool isEmptyStr = [MyClassName isStringEmpty: str] Trotzdem ist es besser, wenn wir es unter Kategorie deklarieren. Denn irgendwie müssen wir auch die Vorteile von Kategorien nutzen.
iDevAmit

4

Mit dieser Methode können Sie überprüfen, ob Ihre Zeichenfolge leer ist oder nicht:

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

Es wird empfohlen, eine gemeinsam genutzte Klasse UtilityClass zu verwenden und diese Methode hinzuzufügen, damit Sie diese Methode verwenden können, indem Sie sie einfach in Ihrer Anwendung aufrufen.


4

Sie haben zwei Methoden, um zu überprüfen, ob die Zeichenfolge leer ist oder nicht:

Angenommen, Ihr String-Name lautet NSString *strIsEmpty.

Methode 1:

if(strIsEmpty.length==0)
{
    //String is empty
}

else
{
    //String is not empty
}

Methode 2:

if([strIsEmpty isEqualToString:@""])
{
    //String is empty
}

else
{
    //String is not empty
}

Wählen Sie eine der oben genannten Methoden und erfahren Sie, ob die Zeichenfolge leer ist oder nicht.


3

Überprüfen Sie einfach Ihre Saitenlänge

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

Eine Nachricht an NIL gibt nil oder 0 zurück, sodass Sie nicht auf nil testen müssen :).

Viel Spaß beim Codieren ...


Ich habe das so oft benutzt. Absolut keine Notwendigkeit für Erweiterungen, Kategorien und was nicht.
pnizzle

2

Es wirkt als Zauber für mich

Wenn das NSStringists

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

    NSLog(@"s is empty");

} else {

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

}

2

Abgesehen von dem Grundkonzept der Überprüfung auf eine Zeichenfolgenlänge von weniger als 1 ist es daher wichtig, den Kontext gründlich zu berücksichtigen. Sprachen, die menschlich oder computergestützt sind oder auf andere Weise unterschiedliche Definitionen für leere Zeichenfolgen haben, und innerhalb derselben Sprachen kann ein zusätzlicher Kontext die Bedeutung weiter ändern.

Angenommen, eine leere Zeichenfolge bedeutet "eine Zeichenfolge, die im aktuellen Kontext keine signifikanten Zeichen enthält".

Dies kann visuell bedeuten, da Farbe und Hintergrundfarbe in einer zugeordneten Zeichenfolge gleich sind. Effektiv leer.

Dies könnte bedeuten, dass keine aussagekräftigen Zeichen mehr vorhanden sind. Alle Punkte oder alle Striche oder alle Unterstriche können als leer betrachtet werden. Darüber hinaus kann ein Leerzeichen ohne aussagekräftige signifikante Zeichen eine Zeichenfolge bedeuten, die keine Zeichen enthält, die der Leser versteht. Dies können Zeichen in einer Sprache oder einem Zeichensatz sein, die für den Leser als bedeutungslos definiert sind. Wir könnten es etwas anders definieren, zu sagen, dass die Zeichenfolge in einer bestimmten Sprache keine bekannten Wörter bildet.

Wir könnten sagen, leer ist eine Funktion des Prozentsatzes des negativen Raums in den gerenderten Glyphen.

Selbst eine Folge nicht druckbarer Zeichen ohne allgemeine visuelle Darstellung ist nicht wirklich leer. Steuerzeichen kommen mir in den Sinn. Besonders der niedrige ASCII-Bereich (ich bin überrascht, dass niemand diese erwähnt hat, da sie viele Systeme abspritzen und keine Leerzeichen sind, da sie normalerweise keine Glyphen und keine visuellen Metriken haben). Die Stringlänge ist jedoch nicht Null.

Fazit. Länge allein ist hier nicht das einzige Maß. Die kontextbezogene Mitgliedschaft ist auch ziemlich wichtig.

Die Mitgliedschaft im Zeichensatz ist eine sehr wichtige allgemeine zusätzliche Maßnahme. Sinnvolle Sequenzen sind auch ziemlich häufig. (Denken Sie an SETI oder Krypto oder Captchas.) Es gibt auch weitere abstraktere Kontextsätze.

Überlegen Sie also genau, bevor Sie davon ausgehen, dass eine Zeichenfolge nur aufgrund der Länge oder des Leerzeichens leer ist.


2

Sehr nützlicher Beitrag, um NSDictionary-Unterstützung sowie eine kleine Änderung hinzuzufügen

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

Kopie des @ Brane-Kommentars: Wenn Sie sich in einer Situation befinden, in der Sie nicht wissen, welchen Objekttyp Sie überprüfen, funktioniert dies vermutlich. Ich schlage jedoch vor, dass Sie größere Probleme haben, wenn Sie nicht wissen, ob ein Objekt NSData oder NSDictionary ist. Was ist Ihr nächstes Makro nach diesem Aufruf condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Früher oder später werden Sie sich fragen, mit welcher Art von Klasse Sie es zu tun haben, besser, wenn Sie dies zuerst tun.
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
Die ersten drei Bedingungen sind überflüssig, und Sie haben die Quelle fürstringByStrippingWhitespace
mattsven

2

Der beste Weg ist, die Kategorie zu verwenden.
Sie können die folgende Funktion überprüfen. Welches hat alle Bedingungen zu überprüfen.

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

In jedem Fall ist es am besten, die Länge der angegebenen Zeichenfolge zu überprüfen. Wenn Ihre Zeichenfolge myString ist, lautet der Code:

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


1

Überprüfen Sie dies :

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

Oder

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

Hoffe das wird helfen.


1

Sie können leicht überprüfen, ob die Zeichenfolge leer ist:

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

1

Ich habe eine leere Zeichenfolge mit dem folgenden Code überprüft:

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

Es ist so einfach wie if([myString isEqual:@""])oderif([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

Sie können eine leere Zeichenfolge auf zwei Arten haben:

1) @ "" // Enthält kein Leerzeichen

2) @ "" // Platz enthalten

Technisch gesehen sind beide Saiten leer. Wir können beide Dinge nur mit EINER Bedingung schreiben

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

0

Versuche Folgendes

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
Die Nullprüfung muss zuerst erfolgen. str.lengthlöst eine Ausnahme aus, wenn strnull ist.
Jeffery Thomas

-2
if( [txtMobile.text length] == 0 )
{
    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.