web-dev-qa-db-ja.com

NSStringは空です

NSStringが空かどうかをどのようにテストしますか?またはすべての空白またはnil?単一のメソッド呼び出しで?

36
Yazzmi

あなたはこのようなことを試すことができます:

@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

ADCの NSString リファレンスを確認してください。

96
Jacob Relkin

これは私が使用するもので、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;  
}
14
scooter133

私が使う、

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

私はこの非常に古い火に別のログを投げるのが嫌いですが、私は他の誰かの答えを編集することを強く望んでいます-それが選択された答えであるときは特にです。

Jacobがフォローアップの質問をしました:単一のメソッド呼び出しでこれを行うにはどうすればよいですか?

答えは、基本的にObjective-Cの基本クラスの機能を拡張するカテゴリを作成し、他のすべてのコードの「省略形」メソッドを記述することです。

ただし、技術的には、空白文字を含む文字列は空ではありません-目に見えるグリフが含まれていないだけです(過去2年間、isEmptyStringと呼ばれるメソッドを使用していて、この質問を読んだ後、今日変換しました、答え、およびコメントセット)。

カテゴリを作成するには、Option + Click-> New File ...(またはFile-> New-> File ...または単にcommand + n)-> Objective-C Categoryを選択します。カテゴリの名前を選択します(これにより、名前空間が作成され、今後発生する可能性のある競合が減少します)-[Category on]ドロップダウンからNSStringを選択します-ファイルをどこかに保存します。 (注:ファイルには自動的にNSString + YourCategoryName.hおよび.mという名前が付けられます。)

私は個人的に、Objective-Cの自己文書化の性質に感謝しています。したがって、私はNSStringに次のカテゴリメソッドを作成して、元のisEmptyString:メソッドを変更し、より適切に宣言されたメソッドを選択しました(コンパイラーが後でコードを圧縮することを信頼しています-少し多すぎるかもしれません)。

ヘッダー(.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

実装(.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

メソッドを呼び出すには、NSString + MyCategoryName.hファイルを、この種の検証を実行している.hまたは.m(カテゴリには.mが望ましい)クラスに必ずインポートして、次のようにします。

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

うまくいけば、それはすべての基盤をカバーしています。私が最初にObjective-Cの開発を始めたとき、カテゴリーはそれらの「えっ?」の1つでした。試練-私は今、再利用性を高めるためにそれらをかなり使用しています。

編集:そして、技術的には、文字を削除する場合、これは次のようになります:

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

本当に必要なのはこれだけです(コピーを含め、カテゴリメソッドが行うすべてのことを行う必要があります)が、その点で間違っている可能性があります。

4
Josh Bruce

空の文字列だけでなくnil文字列でも機能するため、私はこの定義を使用しています。

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

実際には、現在は次のようになっています。

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

ジェイコブ・レルキンの回答とジョナサンのコメントに基づいて:

@implementation TextUtils

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

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

        return NO;
    }

    @end
0
pvllnspk

多分あなたはこのようなことを試すことができます:

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

簡単にする必要があります:

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