Come posso verificare se una stringa è vuota in Objective-C?


Risposte:


1156

Puoi verificare se [string length] == 0. Questo verificherà se si tratta di una stringa valida ma vuota (@ "") e se è nulla, poiché la chiamata lengtha zero restituirà anche 0.


12
Ci sono alcune stringhe NSS molto rare in cui ciò comporterà un falso negativo (dicendo che la stringa non è vuota, quando, per scopi pratici, lo è). Considera @"\u200B"(composto solo dal carattere Unicode ZERO WIDTH SPACE . La sua stampa stamperà 0 caratteri (verifica utilizzando il carattere a spaziatura fissa), ma string.length darà 1. Ci sono altri caratteri Unicode (come OBJECT REPLACEMENT CHARACTER ) che si comportano allo stesso modo. ottieni quest'ultimo quando analizza il testo PDF.
dal

43
@fzwo non è un asino, ma in teoria non dà un falso negativo. Si comporta esattamente come ti aspetteresti. La tua interpretazione di ciò che ZERO WIDTH SPACEè non ha davvero importanza, perché @"\u200B" è comunque un personaggio, quindi se testerai che la stringa sia vuota, dirà che non lo è perché c'è un carattere in essa. Non è semplicemente stampabile seguendo lo standard Unicode.
bmeulmeester,

2
Naturalmente è tecnicamente corretto, non lo sto discutendo. Voglio solo avvertire che questo potrebbe non mostrare il comportamento previsto o previsto, motivo per cui ho scritto "per scopi pratici". Dipende dal significato previsto di "vuoto".
dal

4
Non è un falso negativo. Uno "spazio a valore zero" è un carattere unicode come un altro. Vale solo la pena "ricordare" se rilevante per la tua app. (Ottimo pensiero, due!)
Fattie,

2
Fatemi sapere se mi sbaglio, ma credo che si potrebbe anche omettere == 0 parte e aggiungi una negazione di fronte: ![string length]. Sembra più pulito.
damirstuhec,

126

La risposta di Marc è corretta. Ma colgo l'occasione per includere un puntatore al generalizzato di Wil Shipley isEmpty, che ha condiviso sul suo blog :

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
Se si desidera che questo sia molto generalizzato, si potrebbe implementare questa logica come categoria su NSObject invece di utilizzare un metodo statico come mostrato qui.
Brad The App Guy,

16
Stranamente, questo non controlla effettivamente [NSNull null].
Peter N Lewis,

14
Se ti trovi in ​​una situazione in cui non sai quale tipo di oggetto stai controllando, immagino che funzioni. Tuttavia suggerisco che se non sai se un oggetto è NSData o NSArray, hai problemi più grandi. Qual è la tua prossima macro dopo questa chiamata, condenseToSingleNSData (cosa id)? expandToNSArray (cosa id)? Prima o poi ti chiederai con che tipo di classe hai a che fare, meglio farlo al primo riferimento.
Brane,

1
@BradSmith, si potrebbe creare una categoria per essa ma i valori nulli non verrebbero conteggiati poiché il metodo non verrebbe chiamato. Ad esempio, se cosa = zero, [cosa IsEmpty] non verrebbe chiamato e restituirebbe sempre falso / NO. Per verificare lo zero, è necessario un parametro. Gli oggetti zero non possono confrontarsi come zero tramite una categoria.
Chris,

3
@chris allora puoi cambiare il metodo di categoria in -isNotEmpty:)
nielsbot il

93

Il primo approccio è valido, ma non funziona se la stringa ha spazi vuoti ( @" "). Quindi è necessario cancellare questi spazi bianchi prima di testarlo.

Questo codice cancella tutti gli spazi vuoti su entrambi i lati della stringa:

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

Una buona idea è creare una macro, quindi non è necessario digitare questa linea di mostri:

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

Ora puoi usare:

NSString *emptyString = @"   ";

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

3
Perché usare le macro quando non sono necessarie? In questo caso, qualsiasi tipo di sicurezza viene sacrificata per nessun beneficio reale.
EM,

È per comodità semplice, se ti piace scrivere "[object stringObject stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]" ogni volta che vuoi controllare se una stringa è vuota, dipende da te.
SEQOY Development Team,

18
sarebbe meglio essere servito da una NSStringcategoria che aggiunge un metodo chiamato trimmedStringche fa esattamente quello che hai scritto.
Dave DeLong,

2
Nota che Apple whitespaceCharacterSetnon include newline! Ecco una categoria che ho scritto includendo trime alcuni altri metodi utili: github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/…
AlexChaffee

@EM Non sono un fan delle macro, ma non capisco la tua preoccupazione per la sicurezza dei tipi. Durante la compilazione la macro viene sostituita con il suo contenuto, quindi se si richiama la macro con qualcosa di diverso da una NSString si ottiene comunque un messaggio dal compilatore. Le categorie sarebbero comunque molto migliori.
Zmaster

32

Una delle migliori soluzioni che abbia mai visto (migliore di quella di Matt G) è questa funzione inline migliorata che ho acquisito su alcuni repository Git Hub (quello di Wil Shipley, ma non riesco a trovare il link):

// 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
Questo è il lavoro di Wil Shipley. Cordiali saluti, puoi cambiare [thing isKindOfClass: [NSNull class]] in just (thing == [NSNull null])
Steve N

Accidenti .... esattamente quello che stavo cercando. Stavo impazzendo, cercando di capire perché la mia funzione "cellForRowAtIndexPath" si arrestasse in modo anomalo a causa di stringhe null (e non riuscivo a rilevare il problema). Questa funzione l'ha risolto perfettamente.
Mike Gledhill,

Copia del commento di @Brane: se ti trovi in ​​una situazione in cui non sai quale tipo di oggetto stai controllando, immagino che funzioni. Tuttavia suggerisco che se non sai se un oggetto è NSData o NSArray, hai problemi più grandi. Qual è la tua prossima macro dopo questa chiamata condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Prima o poi ti chiederai con che tipo di classe hai a che fare, meglio farlo al primo riferimento.
Cœur

16

Dovresti usare meglio questa categoria:

@implementation NSString (Empty)

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

@end

6
Tale definizione concluderebbe che la stringa "/ r / n / r / n" è vuota, quando chiaramente non lo è - contiene spazi bianchi. La tua funzione è davvero: - (BOOL) isWhitespace (NSString *);
JBR Wilkinson,

6
Un corollario a questo. Ho implementato questa categoria e c'è una svolta. Se lo chiamate su una stringa nulla, questa funzione non viene mai chiamata e viene restituito un NO (o ciò che viene valutato NO) come valore di ritorno. Quindi pensi che non sia vuoto ... Potrebbe funzionare se il nome fosse Riempito o qualcosa del genere.
Ying,

Immagino che la categoria giusta sarebbe quindi: @implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end come una combinazione della risposta di Marc e Kyle.
palme

12

Ho messo questo:

@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

Il problema è che se l'io è zero, questa funzione non viene mai chiamata. Restituirà false, il che è desiderato.


la migliore soluzione poiché a) è il metodo di istanza eb) categoria c) nil caso su se stesso è gestito da 'isNotEmpty' Thx!
Denis

Ottima idea, peccato -(BOOL)isEmpty{ return ![self isNotEmpty]}che non funzionerà sulla categoria.
Alston,

Copia del commento di @Brane: se ti trovi in ​​una situazione in cui non sai quale tipo di oggetto stai controllando, immagino che funzioni. Tuttavia suggerisco che se non sai se un oggetto è NSData o NSArray, hai problemi più grandi. Qual è la tua prossima macro dopo questa chiamata condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Prima o poi ti chiederai con che tipo di classe hai a che fare, meglio farlo al primo riferimento.
Cœur

11

Un'altra opzione è quella di verificare se è uguale @""con isEqualToString:in questo modo:

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

11

Basta passare la stringa al seguente metodo:

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

Dai un'occhiata ai commenti su stackoverflow.com/questions/21605075/… per capire perché è sbagliato. Inoltre, come va meglio delle altre risposte qui.
Popeye,

6

Basta usare una delle if elsecondizioni come mostrato di seguito:

Metodo 1:

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

Metodo 2:

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

6

Versione rapida

Anche se questa è una domanda dell'obiettivo C, dovevo usare NSStringSwift, quindi includerò anche una risposta qui.

let myNSString: NSString = ""

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

O se NSStringè un opzionale:

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

La normale Stringversione di Swift è

let myString: String = ""

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

Vedi anche: Controlla la stringa vuota in Swift?


5

Potrebbe essere questa risposta il duplicato di risposte già fornite, ma ho apportato poche modifiche e cambiamenti nell'ordine di verifica delle condizioni. Si prega di fare riferimento al codice seguente:

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

Questa è una categoria, puoi vedere come crearla qui: goo.gl/bRcfn7 . Mi piace l'idea di una categoria per questo
Daniel Gomez Rico,

No, non possiamo dire che questa sia categoria. Se questa funzione è implementata sotto la categoria della classe NSString, allora è categoria. Altrimenti possiamo chiamare questo metodo con il nome della classe ovunque lo abbiamo implementato. Come Bool isEmptyStr = [MyClassName isStringEmpty: str] Tuttavia, sarà più utile se lo dichiareremo nella categoria. Perché in qualche modo dobbiamo sfruttare anche le categorie.
iDevAmit

4

Puoi controllare che la tua stringa sia vuota o meno usando questo metodo:

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

La migliore pratica è far dire a una classe condivisa UtilityClass e aggiungere questo metodo in modo da poter utilizzare questo metodo semplicemente chiamandolo attraverso l'applicazione.


4

Hai 2 metodi per verificare se la stringa è vuota o meno:

Supponiamo che il nome della stringa sia NSString *strIsEmpty.

Metodo 1:

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

else
{
    //String is not empty
}

Metodo 2:

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

else
{
    //String is not empty
}

Scegli uno dei metodi sopra indicati e scopri se la stringa è vuota o meno.


3

Controlla semplicemente la lunghezza della stringa

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

un messaggio a NIL restituirà zero o 0, quindi non è necessario testare nulla :).

Buona codifica ...


L'ho usato così tante volte. Assolutamente nessuna necessità di estensioni, categorie e cosa no.
pnizzle

2

Funziona come un incanto per me

Se la NSString ès

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

    NSLog(@"s is empty");

} else {

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

}

2

Quindi, a parte il concetto base di controllo per una lunghezza della stringa inferiore a 1, è importante considerare profondamente il contesto. Le lingue umane o informatiche o altrimenti potrebbero avere definizioni diverse di stringhe vuote e all'interno di quelle stesse lingue, un contesto aggiuntivo potrebbe cambiare ulteriormente il significato.

Diciamo che stringa vuota significa "una stringa che non contiene caratteri significativi nel contesto corrente".

Ciò potrebbe significare visivamente, poiché il colore e il colore di sfondo sono gli stessi in una stringa attribuita. Efficacemente vuoto.

Questo potrebbe significare privo di caratteri significativi. Tutti i punti o tutti i trattini o tutti i trattini bassi possono essere considerati vuoti. Inoltre, privo di caratteri significativi significativi potrebbe significare una stringa che non ha caratteri che il lettore capisce. Potrebbero essere personaggi in una lingua o set di caratteri definiti insignificanti per il lettore. Potremmo definire in modo leggermente diverso dire che la stringa non forma parole conosciute in una determinata lingua.

Potremmo dire che vuoto è una funzione della percentuale di spazio negativo nei glifi resi.

Anche una sequenza di caratteri non stampabili senza una rappresentazione visiva generale non è veramente vuota. I personaggi di controllo vengono in mente. Soprattutto la bassa gamma ASCII (sono sorpreso che nessuno abbia menzionato quelli in quanto utilizzano molti sistemi e non sono spazi bianchi in quanto normalmente non hanno glifi né metriche visive). Tuttavia la lunghezza della stringa non è zero.

Conclusione. La sola lunghezza non è l'unica misura qui. Anche l'appartenenza al set contestuale è piuttosto importante.

L'appartenenza al set di caratteri è una misura aggiuntiva comune molto importante. Le sequenze significative sono anche abbastanza comuni. (pensa a SETI o cripto o captcha) Esistono anche altri set di contesti più astratti.

Quindi pensa attentamente prima di assumere che una stringa sia vuota solo in base alla lunghezza o agli spazi.


2

Post molto utile, per aggiungere il supporto NSDictionary e una piccola modifica

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

Copia del commento di @Brane: se ti trovi in ​​una situazione in cui non sai quale tipo di oggetto stai controllando, immagino che funzioni. Tuttavia suggerisco che se non sai se un oggetto è NSData o NSDictionary, hai problemi più grandi. Qual è la tua prossima macro dopo questa chiamata condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Prima o poi ti chiederai con che tipo di classe hai a che fare, meglio farlo al primo riferimento.
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
Le prime tre condizioni sono ridondanti e non hai incluso la fonte perstringByStrippingWhitespace
mattsven,

2

Il modo migliore è usare la categoria.
È possibile verificare la seguente funzione. Che ha tutte le condizioni per verificare.

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

Il modo migliore in ogni caso è controllare la lunghezza di una determinata stringa. Per questo se la tua stringa è myString, il codice è:

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


1

verificare questo :

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

O

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

Spero che questo possa aiutare.


1

Puoi facilmente verificare se la stringa è vuota con questo:

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

1

Ho controllato una stringa vuota usando il codice seguente:

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

È semplice come if([myString isEqual:@""])oif([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

Puoi avere una stringa vuota in due modi:

1) @ "" // Non contiene spazio

2) @ "" // Contenere lo spazio

Tecnicamente entrambe le stringhe sono vuote. Possiamo scrivere entrambe le cose semplicemente usando UNA Condizione

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

0

Prova quanto segue

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
Il controllo null deve essere il primo. str.lengthgenererà un'eccezione se strè null.
Jeffery Thomas,

-2
if( [txtMobile.text length] == 0 )
{
    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.