2013-01-23 7 views
29

私はNSStringの上の小さなカテゴリーを書いていた、と私はこの方法が正確であるかどうかを知りたかったのは、すべての潜在的なユースケースを処理します。NSString "nil or empty"チェック - これは完了ですか?

更新:を明確にする - 私は確信して、私はいくつかが欠落していないよにしたかったですあなたは条件付き除去することで、コードを簡素化することができ

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

これでうまくいきます。 "空"をチェックするダースの方法があります - 長さ==ゼロは別です。 –

+6

実際には、(if a [aString length] == 0)return YES; 'という1つのテストしか使用できません。これは、Objective-Cの "機能"を利用して、nilポインタを呼び出すすべてのメソッドがゼロを返すようにします。 –

+3

(もちろん、 'return [aString length] == 0;'に短縮することもできます) –

答えて

110

私は、次の条件付きを使用しても、カテゴリを必要としない:

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

Objective-Cの理論を用いて、NILへのメッセージは、あなたが持っていないので基本的には、nilを返すか、ゼロになりますnilをテストする

+2

!aString.lengthは、aStringがnilのときに真です。しかし、 'aString.length!= 0'は私のために働く! – JordanChina

+1

それはまさにそれがすべきことです。 – Stas

28

:文字エンコーディング、など。

@implementation NSString (Helpers) 

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

使用例を含む変わり者場合

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

ニトリックのカップル:ドット構文は実際にはプロパティではなく、メソッドで使用する必要があります。長さは方法です。追加ボーナスとして、長さを正しく呼び出すと、文字列に関してnilを再度チェックする必要はありません。だから、あなたは 'return [aString length] == 0;'これはうまくいきません。なぜなら、nilの呼び出し長は0を返すからです。 – memmons

2

NSStringのカテゴリとして、この種の「空でも空でもない」テストの例があります。 dasblinkenlightの答え@

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

文字列がnilの場合、これらのメソッドは呼び出されません。 – c0ming

+0

@ c0mingしかし結果は正しいでしょう。メッセージをnil文字列に送信すると、結果としてNOが返されます。このメソッドの文字列からYESを受け取るには、少なくともnilであってはなりません。そうすれば、テストを通過するはずです。 – kokoko

7

は大丈夫ですが、私が使用するはるかに読みやすい条件のチェックは次のとおりです。

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

非常に簡潔かつ独立した便利な関数の定義を必要としません。覚えておくのは簡単です。

EDIT:@Michael G. Emmonsがこの回答の最後のコメントとしてこれを投稿しました。彼には信用できますが、私はこれを自分自身の答えとして挙げています。

+0

あなたの答えをありがとう。問題は 'isStringNilOrEmpty'メソッドの正しい実装に関するものでした。私は両方の条件をチェックする単一のメソッドを望んでいました。 –

+0

私はあなたの状態が逆転していると思います。 – oldergod

0

は単純にゼロまたは0、そうはnil :)のためにテストする必要はありませんが返されますNILにあなたの文字列の長さ

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

メッセージを確認してください。

ハッピーコーディング...

0

、スペースをチェックする長さを計算する前に空白を削除することを確認します。

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