Objective-Cで文字列が空かどうかをテストするにはどうすればよいですか?


回答:


1156

かどうかを確認でき[string length] == 0ます。lengthnilを呼び出すと0も返されるため、これは、有効であるが空の文字列(@ "")であるか、nilであるかをチェックします。


12
非常にまれなNSStringがいくつかあり、これにより偽陰性が発生します(文字列が空ではない場合、実際の目的では空であると言います)。@"\u200B"(Unicode文字ZERO WIDTH SPACEのみで構成されていることを考慮してください。印刷すると0文字が印刷されます(等幅フォントを使用して確認します)が、string.lengthは1になります。同様に動作する他のUnicode文字(OBJECT REPLACEMENT CHARACTERなど)があります。 PDFテキストの解析時に後者を取得
fzwo

43
@fzwoは馬鹿ではありませんが、理論的には偽陰性を与えません。これは、振る舞いを正確にあなたが期待通り。それでも文字なので、文字列が空であるかどうかをテストすると、文字が含まれているため、文字列が空であるとは解釈されZERO WIDTH SPACEません。Unicode標準に従っているだけでは印刷できません。@"\u200B"
bmeulmeester 2014年

2
もちろん、それは技術的に正しいです、私はそれについて議論していません。私はこれが意図されたまたは期待された動作を示さない可能性があることを警告したいだけです。それは「空」の意図された意味に依存します。
fzwo 2014年

4
それは偽陰性ではありません。「ゼロ相当のスペース」は、他と同様にユニコード文字です。アプリに関連している場合は、「覚えておく価値がある」だけです。(すばらしい思考、fzwo!)
Fattie

2
私が間違っているかどうか教えてください。ただし、== 0の部分を省略して、前に否定を追加することもできます![string length]。よりきれいに見えます。
damirstuhec 2014

126

マルクの答えは正しいです。しかし、この機会に、isEmpty彼がブログで共有したWil Shipleyの一般化されたへのポインタを含めます。

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
これを非常に一般化したい場合は、ここに示すように静的メソッドを使用する代わりに、このロジックをNSObjectのカテゴリとして実装できます。
Brad The App Guy

16
奇妙なことに、これは実際には[NSNull null]をチェックしません。
ピーターNルイス

14
チェックしているオブジェクトの種類がわからない場合は、これでうまくいくと思います。ただし、オブジェクトがNSDataかNSArrayかわからない場合は、さらに大きな問題が発生することをお勧めします。この呼び出しの後に次のマクロになるのは、condenseToSingleNSData(idthing)ですか?expandToNSArray(idthing)?遅かれ早かれ、どのような種類のクラスを扱っているのかを尋ねるでしょう。最初の参照で行うほうがよいでしょう。
Brane

1
@BradSmith、カテゴリを作成できますが、メソッドが呼び出されないため、nil値はカウントされません。たとえば、thing = nilの場合、[thing IsEmpty]は呼び出されず、常にfalse / NOを返します。nilを確認するには、パラメーターが必要です。Nilオブジェクトは、カテゴリを介してそれ自体をnilとして比較することはできません。
Chris

3
@chris次に、カテゴリメソッドを-isNotEmpty:)に変更できます
nielsbot

93

最初の方法は有効ですが、文字列に空白スペース(@" ")がある場合は機能しません。したがって、テストする前にこの空白をクリアする必要があります。

次のコードは、文字列の両側のすべての空白を消去します。

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

1つの良いアイデアは、1つのマクロを作成することです。したがって、このモンスターの行を入力する必要はありません。

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

今あなたは使うことができます:

NSString *emptyString = @"   ";

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

3
マクロが必要ないのになぜ使用するのですか?この場合、実際の利益のために、ソートタイプの安全性が犠牲になります。
EM

1つの文字列が空かどうかを確認するたびに "[object stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]"と書きたい場合は、簡単です。
SEQOY開発チーム2010

18
それは、あなたが書いたことを正確に実行NSStringするというメソッドを追加するカテゴリによって提供される方がよいでしょうtrimmedString
Dave DeLong

2
AppleにwhitespaceCharacterSetは改行が含まれていないことに注意してください!ここで私が書いたを含むカテゴリですtrim:いくつかの他の有用な方法およびgithub.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/...
AlexChaffee

@EM私はマクロのファンではありませんが、タイプセーフの問題を理解していません。コンパイル中にマクロはその内容で置き換えられるため、NSStringとは異なるものでマクロを呼び出すと、コンパイラからメッセージが表示されます。とにかくカテゴリーははるかに良いでしょう。
Zmaster 2013

32

私が今まで見た中で最高の解決策の1つ(Matt Gの解決策よりも優れています)は、Git Hubリポジトリ(Wil Shipleyのリポジトリですが、リンクが見つかりません)で取得したこの改善されたインライン関数です。

// 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
ウィル・シプリーの作品です。参考までに、[thing isKindOfClass:[NSNull class]]をjust(thing == [NSNull null])に変更できます
Steve N

ふew……まさに探していたもの。空の文字列が原因で「cellForRowAtIndexPath」関数がクラッシュする理由を解明しようとして、私は気が狂いそうでした(そして問題をキャッチできませんでした)。この機能はそれを完全に解決しました。
Mike Gledhill

@Braneコメントのコピー:チェックしているオブジェクトの種類がわからない場合は、これでうまくいくと思います。ただし、オブジェクトがNSDataかNSArrayかわからない場合は、さらに大きな問題が発生することをお勧めします。この呼び出しの後、次のマクロはどうなりますcondenseToSingleNSData(id thing)か?expandToNSArray(id thing)?遅かれ早かれ、どのような種類のクラスを処理するのかを尋ねるようになります。最初の参照で実行することをお勧めします。
2018年

16

このカテゴリを使用することをお勧めします。

@implementation NSString (Empty)

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

@end

6
その定義は、文字列 "/ r / n / r / n"が空でないことを明らかにします-それは空白を含んでいます-それは空白を含んでいます。あなたの関数は本当に:-(BOOL)isWhitespace(NSString *);
JBRウィルキンソン

6
これの当然の結果。このカテゴリを実装しましたが、ひねりがあります。これをnil文字列で呼び出すと、この関数は呼び出されず、戻り値としてNO(またはNOと評価されるもの)が返されます。次に、それは空ではないと考えます... isFilledなどの名前の場合、これは機能する可能性があります。
Ying

正しいカテゴリは次のようになると思います:@implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end マークとカイルの答えの組み合わせとして。
パルメ2013

12

私はこれを置きました:

@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

問題は、自分自身がnilの場合、この関数が呼び出されないことです。これは、望ましいfalseを返します。


a)はインスタンスメソッドであり、b)カテゴリはc)それ自体がnilの場合は 'isNotEmpty'によって処理されるため、最適なソリューションですThx!
デニス

素晴らしいアイデアですが、-(BOOL)isEmpty{ return ![self isNotEmpty]}カテゴリが悪すぎるとうまくいきません。
Alston

@Braneコメントのコピー:チェックしているオブジェクトの種類がわからない場合は、これでうまくいくと思います。ただし、オブジェクトがNSDataかNSArrayかわからない場合は、さらに大きな問題が発生することをお勧めします。この呼び出しの後、次のマクロはどうなりますcondenseToSingleNSData(id thing)か?expandToNSArray(id thing)?遅かれ早かれ、どのような種類のクラスを処理するのかを尋ねるようになります。最初の参照で実行することをお勧めします。
2018年

11

別のオプションは、それがに等しいかどうかを確認することである@""isEqualToString:そうのように:

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

11

文字列を次のメソッドに渡すだけです:

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

stackoverflow.com/questions/21605075/…のコメントをチェックして、なぜこれが間違っているのかを確認してください。また、これは他の答えよりも優れています。
ポパイ14

6

if else以下に示すように、いずれかの条件を使用します。

方法1:

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

方法2:

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

6

Swiftバージョン

これはObjective Cの質問ですがNSString、Swiftで使用する必要があったので、ここにも回答を含めます。

let myNSString: NSString = ""

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

またはNSStringオプションの場合:

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

通常のSwift Stringバージョンは

let myString: String = ""

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

参照:Swiftで空の文字列を確認しますか?


5

この答えはすでに与えられた答えの複製であるかもしれませんが、私は条件をチェックする順序でいくつかの変更と変更を行いました。以下のコードを参照してください:

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

これはカテゴリです。作成方法はgoo.gl/bRcfn7で確認できます。私はこのためのカテゴリーのアイデアが好きです
ダニエルゴメスリコ

いいえ、これがカテゴリーであるとは言えません。この関数がNSStringクラスのカテゴリの下に実装されている場合、それはカテゴリです。それ以外の場合は、実装した場所にクラスの名前を指定してこのメ​​ソッドを呼び出すことができます。Bool isEmptyStr = [MyClassName isStringEmpty:str]と同様ですが、それでも、それをカテゴリの下で宣言する方が良いでしょう。どういうわけか、カテゴリーも活用する必要があるからです。
iDevAmit 2014

4

このメソッドを使用して、文字列が空かどうかを確認できます。

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

ベストプラクティスは、共有クラスにUtilityClassを指定してこのメ​​ソッドを宣言し、アプリケーション全体から呼び出すだけでこのメソッドを使用できるようにすることです。


4

文字列が空かどうかを確認する方法は2つあります。

文字列名がであるとしましょうNSString *strIsEmpty

方法1:

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

else
{
    //String is not empty
}

方法2:

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

else
{
    //String is not empty
}

上記の方法のいずれかを選択して、文字列が空かどうかを確認します。


3

単にあなたの弦の長さを確認してください

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

NILへのメッセージはnilまたは0を返すため、nilをテストする必要はありません:)。

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


これを何度も使っています。拡張機能、カテゴリなどはまったく必要ありません。
pnizzle

2

私にとって魅力的です

場合NSStringでありますs

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

    NSLog(@"s is empty");

} else {

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

}

2

したがって、1未満の文字列長をチェックするという基本的な概念は別として、コンテキストを深く検討することが重要です。人間やコンピューターなどの言語では、空の文字列の定義が異なる場合があり、それらの同じ言語内では、追加のコンテキストによって意味がさらに変わる場合があります。

空の文字列は「現在のコンテキストで重要な文字を含まない文字列」を意味するとしましょう。

属性文字列では色と背景色が同じであるため、これは視覚的に意味する場合があります。実質的に空です。

これは、意味のある文字がないことを意味します。すべてのドット、すべてのダッシュ、またはすべての下線は空と見なされる場合があります。さらに、意味のある重要な文字がないと、読者が理解できる文字がない文字列を意味する可能性があります。それらは、読者にとって意味のないものとして定義された言語または文字セットの文字である可能性があります。文字列が特定の言語で既知の単語を形成しないと言うには、少し異なる定義ができます。

空はレンダリングされたグリフの負のスペースのパーセンテージの関数と言えます。

一般的な視覚的表現のない一連の印刷不可能な文字でさえ、実際には空ではありません。制御文字が頭に浮かびます。特に低いASCII範囲(多くのシステムに影響を与え、空白文字ではないため、通常はグリフや視覚的なメトリックがないため、誰もそれを言及しなかったことに驚きます)。しかし、文字列の長さはゼロではありません。

結論。ここでは、長さだけで測るわけではありません。コンテキストセットメンバーシップも非常に重要です。

文字セットのメンバーシップは、非常に重要な一般的な追加の測定です。意味のあるシーケンスもかなり一般的なものです。(SETI、crypto、またはcaptchasと考えてください)さらに多くの抽象的なコンテキストセットも存在します。

したがって、文字列は長さまたは空白に基づいて空であると想定する前に慎重に検討してください。


2

NSDictionaryサポートと1つの小さな変更を追加するための非常に便利な投稿

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

@Braneコメントのコピー:チェックしているオブジェクトの種類がわからない場合は、これでうまくいくと思います。ただし、オブジェクトがNSDataであるかNSDictionaryであるかがわからない場合は、さらに大きな問題が発生することをお勧めします。この呼び出しの後、次のマクロはどうなりますcondenseToSingleNSData(id thing)か?expandToNSArray(id thing)?遅かれ早かれ、どのような種類のクラスを処理するのかを尋ねるようになります。最初の参照で実行することをお勧めします。
2018年

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
最初の3つの条件は冗長であり、ソースが含まれていませんstringByStrippingWhitespace
mattsven '20

2

最善の方法は、カテゴリを使用することです。
以下の機能を確認できます。チェックするすべての条件があります。

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

いずれの場合も最良の方法は、指定された文字列の長さを確認することです。このため、文字列がmyStringの場合、コードは次のようになります。

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


1

これをチェックして :

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

または

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

これがお役に立てば幸いです。


1

これで文字列が空かどうかを簡単に確認できます:

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

1

以下のコードを使用して空の文字列をチェックしました:

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

次の2つの方法で空の文字列を使用できます。

1)@ "" //スペースを含まない

2)@ "" //スペースを含む

技術的には両方の文字列は空です。ONE条件を使用するだけで、両方を記述できます

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

0

以下をお試しください

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
nullチェックを最初にする必要があります。がnullのstr.length場合、例外がスローされstrます。
Jeffery Thomas

-2
if( [txtMobile.text length] == 0 )
{
    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.