NSStringが空かどうかをどのようにテストしますか?またはすべての空白またはnil?単一のメソッド呼び出しで?
あなたはこのようなことを試すことができます:
@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
リファレンスを確認してください。
これは私が使用するもので、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;
}
私が使う、
+ (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;
}
私はこの非常に古い火に別のログを投げるのが嫌いですが、私は他の誰かの答えを編集することを強く望んでいます-それが選択された答えであるときは特にです。
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
本当に必要なのはこれだけです(コピーを含め、カテゴリメソッドが行うすべてのことを行う必要があります)が、その点で間違っている可能性があります。
空の文字列だけでなくnil文字列でも機能するため、私はこの定義を使用しています。
#define STR_EMPTY(str) \
str.length == 0
実際には、現在は次のようになっています。
#define STR_EMPTY(str) \
(![str isKindOfClass:[NSString class]] || str.length == 0)
ジェイコブ・レルキンの回答とジョナサンのコメントに基づいて:
@implementation TextUtils
+ (BOOL)isEmpty:(NSString*) string {
if([string length] == 0 || ![[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]) {
return YES;
}
return NO;
}
@end
多分あなたはこのようなことを試すことができます:
+ (BOOL)stringIsEmpty:(NSString *)str
{
return (str == nil) || (([str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]).length == 0);
}
簡単にする必要があります:
if (![[string stringByReplacingOccurencesOfString:@" " withString:@""] length]) { NSLog(@"This string is empty"); }