38

NSStringで小さなカテゴリを書いていましたが、このメソッドがすべての潜在的なユースケースを正確に処理できるかどうかを知りたいと思いました。

更新:明確にするために-文字エンコードなどを含む奇妙なケースを見逃していないことを確認したかったのです。

@implementation NSString (Helpers)

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

使用例:

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

6 に答える 6

132

次の条件付きのみを使用し、カテゴリも必要ありません。

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

Objective-C理論を使用すると、NILへのメッセージはnilまたはゼロを返すため、基本的にnilをテストする必要はありません

于 2013-10-09T09:27:17.697 に答える
29

条件付きを削除することで、コードを簡略化できます。

+(BOOL)stringIsNilOrEmpty:(NSString*)aString {
    return !(aString && aString.length);
}
于 2013-01-23T03:48:14.513 に答える
9

@dasblinkenlightの答えは問題ありませんが、私が使用するはるかに読みやすい条件付きチェックは次のとおりです。

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

非常に簡潔で、個別の便利な関数定義を必要としません。覚えるのは簡単です。

編集:@Michael G. Emmonsは、その回答に対する最後のコメントとしてこれを投稿しました...彼の功績ですが、私はこれをそれ自体で回答としてリストしています。

于 2014-04-16T12:24:05.843 に答える
2

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
于 2014-01-22T03:23:00.973 に答える
0

文字列の長さを確認するだけです

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

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

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

于 2016-05-27T19:58:11.477 に答える
0

長さを計算する前に、必ずスペースを確認し、空白をトリミングしてください。

+(BOOL)stringIsNilOrEmpty:(NSString*)aString {
    return !aString || [[aString  stringByTrimmingCharactersInSet:
                    [NSCharacterSet whitespaceCharacterSet]] length] == 0;
}
于 2017-05-26T09:58:11.540 に答える