2013-01-23 12 views
29

pisałem małą kategorii na NSString i chciałem wiedzieć, czy ta metoda jest dokładnie obsługuje wszystkie potencjalne przypadki użycia:NSString "zerowy lub pusty" czek - czy to jest kompletne?

Aktualizacja: wyjaśnienie - Chciałem się upewnić, że nie jestem brakuje niektórych dziwak przypadek z udziałem kodowania znaków itp ..

@implementation NSString (Helpers) 

+(BOOL)stringIsNilOrEmpty:(NSString*)aString { 
    if (!aString) 
     return YES; 
    return [aString isEqualToString:@""]; 
} 
@end 

wykorzystanie próbki:

-(void) sampleUsage { 
    NSString *emptyString = @""; 
    NSString *nilString = nil; 
    NSAssert([NSString stringIsNilOrEmpty:nilString] == YES, @"String is nil/empty"); 
    NSAssert([NSString stringIsNilOrEmpty:emptyString] == YES, @"String is nil/empty"); 
} 
@end 
+1

To zadziała. Istnieje kilkanaście różnych sposobów sprawdzenia "pustego" - długość == zero to drugie. –

+6

W rzeczywistości można (wzdrygnąć się) użyć tylko jednego testu: 'if ([aString length] == 0) return YES;'. Wykorzystuje to funkcję "Object" C, którą dowolna metoda wywoływania zerowego wskaźnika zwraca zero. –

+3

(I, oczywiście, możesz skrócić to do 'return [aString length] == 0;') –

Odpowiedz

110

używam tylko kolejnym warunkowym i nie trzeba nawet kategorię:

if (!aString.length) 
{ 
    ... 
} 

Stosując teorię Objective-C, komunikat do NIL zwróci zero lub zero, więc w zasadzie nie masz przetestować dla zero.

+2

! AString.length jest prawdziwe, gdy aString jest zerowe, nie wiem dlaczego. Ale 'aString.length! = 0' działa dla mnie! – JordanChina

+1

To jest dokładnie to, co powinno być - prawdziwe dla łańcucha zerowego. – Stas

28

można uprościć przez usunięcie kodu warunkowego:

+(BOOL)stringIsNilOrEmpty:(NSString*)aString { 
    return !(aString && aString.length); 
} 
+16

Kilka nit-picks: Składnia kropki powinna być rzeczywiście używana dla właściwości, a nie metod. Długość jest metodą. Dodatkową korzyścią jest to, że jeśli poprawnie wybierzesz długość, nie musisz już nigdy sprawdzać, czy nie ma nic w odniesieniu do napisów. Tak więc, możesz 'return [aString length] == 0;' Działa tak, ponieważ długość wywołania na zero zwróci 0. – memmons

2

Niektóre przykłady tego rodzaju "nie są puste lub puste" testy jako kategoria na NSString.

// Please note that in general I advocate using a prefix on category methods 
// to avoid category collisions. I've not done this here for clarity. 
// The @interface is also excluded from this example for brevity. 

@implementation NSString (MyAdditions) 

- (BOOL)isNotEmpty 
{ 
    return [self length] != 0; 
} 

- (BOOL)isNotBlank 
{ 
    if ([self isNotEmpty]) 
    { 
    NSCharacterSet *nonWhitespaceSet = [[NSCharacterSet whitespaceAndNewlineCharacterSet] invertedSet]; 
    NSRange range = [self rangeOfCharactersFromSet:nonWhitespaceSet]; 
    return range.location != NSNotFound; 
    } 

    return NO; 
} 

@end 
+0

jeśli ciąg znaków jest zerowy, ta metoda nie będzie wywoływać. – c0ming

+0

@ c0ming, ale wynik będzie prawidłowy. Wysłanie komunikatu do łańcucha zerowego zwróci NIE jako wynik. Aby otrzymać TAK z tej metody, przynajmniej nie powinno być zero, powinno przejść przez test. – kokoko

7

@ odpowiedź dasblinkenlight jest w porządku, ale o wiele bardziej czytelny check warunkowy użyłbym jest:

NSString *string = ...; // define the string 
if ([string length] == 0) { 
    // Do stuff with the string 
} else { 
    // The string is empty or nil here 
} 

bardzo zwięzłe i nie wymaga osobnej definicji funkcji wygoda. Łatwo to zapamiętać.

EDYCJA: @Michael G. Emmons opublikował to jako ostatni komentarz do tej odpowiedzi ... mu się podoba, ale wymieniam to jako odpowiedź samą w sobie.

+0

Dzięki za odpowiedź. Pytanie dotyczyło poprawnej implementacji metody 'isStringNilOrEmpty' - chciałem jednej metody sprawdzającej oba warunki. –

+0

Wierzę, że twój stan się odwrócił. – oldergod

0

Wystarczy sprawdzić swoją długość łańcucha

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

wiadomość do NIL zwróci nil lub 0, więc nie trzeba przetestować na nil :).

Szczęśliwy kodowanie ...

0

Upewnij się, aby sprawdzić, czy przestrzenie, wykończenia spacji przed obliczeniem długości.

+(BOOL)stringIsNilOrEmpty:(NSString*)aString { 
    return !aString || [[aString stringByTrimmingCharactersInSet: 
        [NSCharacterSet whitespaceCharacterSet]] length] == 0; 
} 
Powiązane problemy