2010-08-08 15 views
34

Come si verifica se una NSString è vuota? o tutto lo spazio bianco o nulla? con una singola chiamata al metodo?NSString è vuoto

+0

posible DUP: http: //stackoverflow.com/questions/899209/how-do-i- test-if-a-string-is-vuoto-in-obiettivo-c –

risposta

93

si può provare qualcosa di simile:

@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 

Partenza il riferimento NSString su ADC.

+0

come posso fare tutto ciò con una chiamata al metodo singolo? – Yazzmi

+0

@Yazzmi, ho modificato la mia risposta. –

+0

Dato che ha appena scritto una funzione per te, chiamala. Anche se lo cambierei per restituire SÌ se fosse vuoto, nullo, o avesse spazi bianchi - e NO se la stringa aveva dei caratteri in esso (la funzione come scritta restituirà NO se nella stringa ci sono dei caratteri). –

7

che uso,

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

Questo è quello che uso, un'estensione 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; 
} 
+5

Invece di fare il confronto finale con @" "dovresti solo vedere se [lunghezza della stringa] == 0 –

2

Sto usando questo definire come funziona con le stringhe nulle così come stringhe vuote:

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

In realtà ora il suo in questo modo:

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

Sulla base della risposta Jacob Relkin e Jonathan commento:

@implementation TextUtils 

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

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

     return NO; 
    } 

    @end 
4

Odio buttare un altro registro a questa eccezionale vecchio fuoco, ma sono diffidenti sulla modifica la risposta di qualcun altro - specialmente quando è selezionato risposta.

Jacob ha fatto una domanda di follow-up: come posso farlo con una singola chiamata di metodo?

La risposta è, creando una categoria - che sostanzialmente estende la funzionalità di una classe Objective-C di base - e scrivendo un metodo "stenografia" per tutto l'altro codice.

Tuttavia, tecnicamente, una stringa con caratteri di spazio bianco non è vuota - semplicemente non contiene alcun glifo visibile (negli ultimi due anni ho utilizzato un metodo chiamato ÈEmptyString: e convertito oggi dopo aver letto questo domanda, risposta e commento impostato).

Per creare una categoria, andare su Opzione + Fare clic su -> Nuovo file ... (o File -> Nuovo -> File ... o semplicemente comando + n) -> selezionare Categoria C-Objective. Scegli un nome per la categoria (questo aiuterà lo spazio dei nomi e ridurrà possibili conflitti futuri) - scegli NSString dal menu a discesa "Categoria su" - salva il file da qualche parte. (Nota: il file sarà automaticamente denominato NSString + YourCategoryName.h e .m.)

Personalmente apprezzo la natura autocritica di Objective-C; quindi, ho creato il seguente metodo di categoria su NSString modificando il mio originale isEmptyString: metodo e optando per un metodo dichiarato più appropriato (spero che il compilatore comprima il codice in seguito, forse un po 'troppo).

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

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

Per chiamare il metodo sia sicuro #import file NSString + MyCategoryName.h in .h o .m (io preferisco il.m per le categorie) classe dove si esegue questo tipo di convalida e procedere come segue:

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

Speriamo che copre tutte le basi. Ricordo quando iniziai a sviluppare per Objective-C la categoria era una di quelle "eh?" ordalie per me - ma ora li uso un bel po 'per aumentare la riusabilità.

Edit: E suppongo che, tecnicamente, se stiamo strippaggio caratteri, questo:

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

veramente è tutto ciò che è necessario (dovrebbe fare tutto ciò che il metodo categoria fa, compresa la copia), ma Potrei sbagliarmi su quel punteggio.

+0

Ora ho convertito solo quella riga invece della categoria metodo in tutto il mio codice - funziona come previsto; quindi, non è necessario creare codice aggiuntivo da mantenere. –

0

dovrebbe essere più facile:

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

forse si può provare qualcosa di simile:

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