NSString
Objective-Cでが空かどうかをテストするにはどうすればよいですか?
NSString
Objective-Cでが空かどうかをテストするにはどうすればよいですか?
回答:
かどうかを確認でき[string length] == 0
ます。length
nilを呼び出すと0も返されるため、これは、有効であるが空の文字列(@ "")であるか、nilであるかをチェックします。
ZERO WIDTH SPACE
ません。Unicode標準に従っているだけでは印刷できません。@"\u200B"
![string length]
。よりきれいに見えます。
マルクの答えは正しいです。しかし、この機会に、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);
}
-isNotEmpty
:)に変更できます
最初の方法は有効ですが、文字列に空白スペース(@" "
)がある場合は機能しません。したがって、テストする前にこの空白をクリアする必要があります。
次のコードは、文字列の両側のすべての空白を消去します。
[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];
1つの良いアイデアは、1つのマクロを作成することです。したがって、このモンスターの行を入力する必要はありません。
#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]
今あなたは使うことができます:
NSString *emptyString = @" ";
if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");
NSString
するというメソッドを追加するカテゴリによって提供される方がよいでしょうtrimmedString
。
whitespaceCharacterSet
は改行が含まれていないことに注意してください!ここで私が書いたを含むカテゴリですtrim
:いくつかの他の有用な方法およびgithub.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/...
私が今まで見た中で最高の解決策の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);
}
condenseToSingleNSData(id thing)
か?expandToNSArray(id thing)
?遅かれ早かれ、どのような種類のクラスを処理するのかを尋ねるようになります。最初の参照で実行することをお勧めします。
このカテゴリを使用することをお勧めします。
@implementation NSString (Empty)
- (BOOL) isWhitespace{
return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]length] == 0);
}
@end
@implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end
マークとカイルの答えの組み合わせとして。
私はこれを置きました:
@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を返します。
-(BOOL)isEmpty{ return ![self isNotEmpty]}
カテゴリが悪すぎるとうまくいきません。
condenseToSingleNSData(id thing)
か?expandToNSArray(id thing)
?遅かれ早かれ、どのような種類のクラスを処理するのかを尋ねるようになります。最初の参照で実行することをお勧めします。
文字列を次のメソッドに渡すだけです:
+(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;
}
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
}
これは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.")
}
この答えはすでに与えられた答えの複製であるかもしれませんが、私は条件をチェックする順序でいくつかの変更と変更を行いました。以下のコードを参照してください:
+(BOOL)isStringEmpty:(NSString *)str
{
if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
return YES;
}
return NO;
}
このメソッドを使用して、文字列が空かどうかを確認できます。
+(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を指定してこのメソッドを宣言し、アプリケーション全体から呼び出すだけでこのメソッドを使用できるようにすることです。
したがって、1未満の文字列長をチェックするという基本的な概念は別として、コンテキストを深く検討することが重要です。人間やコンピューターなどの言語では、空の文字列の定義が異なる場合があり、それらの同じ言語内では、追加のコンテキストによって意味がさらに変わる場合があります。
空の文字列は「現在のコンテキストで重要な文字を含まない文字列」を意味するとしましょう。
属性文字列では色と背景色が同じであるため、これは視覚的に意味する場合があります。実質的に空です。
これは、意味のある文字がないことを意味します。すべてのドット、すべてのダッシュ、またはすべての下線は空と見なされる場合があります。さらに、意味のある重要な文字がないと、読者が理解できる文字がない文字列を意味する可能性があります。それらは、読者にとって意味のないものとして定義された言語または文字セットの文字である可能性があります。文字列が特定の言語で既知の単語を形成しないと言うには、少し異なる定義ができます。
空はレンダリングされたグリフの負のスペースのパーセンテージの関数と言えます。
一般的な視覚的表現のない一連の印刷不可能な文字でさえ、実際には空ではありません。制御文字が頭に浮かびます。特に低いASCII範囲(多くのシステムに影響を与え、空白文字ではないため、通常はグリフや視覚的なメトリックがないため、誰もそれを言及しなかったことに驚きます)。しかし、文字列の長さはゼロではありません。
結論。ここでは、長さだけで測るわけではありません。コンテキストセットメンバーシップも非常に重要です。
文字セットのメンバーシップは、非常に重要な一般的な追加の測定です。意味のあるシーケンスもかなり一般的なものです。(SETI、crypto、またはcaptchasと考えてください)さらに多くの抽象的なコンテキストセットも存在します。
したがって、文字列は長さまたは空白に基づいて空であると想定する前に慎重に検討してください。
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);
}
condenseToSingleNSData(id thing)
か?expandToNSArray(id thing)
?遅かれ早かれ、どのような種類のクラスを処理するのかを尋ねるようになります。最初の参照で実行することをお勧めします。
- (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;
}
stringByStrippingWhitespace
最善の方法は、カテゴリを使用することです。
以下の機能を確認できます。チェックするすべての条件があります。
-(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;
}
if (string.length == 0) stringIsEmpty;
これで文字列が空かどうかを簡単に確認できます:
if ([yourstring isEqualToString:@""]) {
// execute your action here if string is empty
}
以下のコードを使用して空の文字列をチェックしました:
//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"];
}
//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;
}
次の2つの方法で空の文字列を使用できます。
1)@ "" //スペースを含まない
2)@ "" //スペースを含む
技術的には両方の文字列は空です。ONE条件を使用するだけで、両方を記述できます
if ([firstNameTF.text stringByReplacingOccurrencesOfString:@" " withString:@""].length==0)
{
NSLog(@"Empty String");
}
else
{
NSLog(@"String contains some value");
}
if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
NSLog(@"String is empty");
}
else{
NSLog(@"String is not empty");
}
str.length
場合、例外がスローされstr
ます。
@"\u200B"
(Unicode文字ZERO WIDTH SPACEのみで構成されていることを考慮してください。印刷すると0文字が印刷されます(等幅フォントを使用して確認します)が、string.lengthは1になります。同様に動作する他のUnicode文字(OBJECT REPLACEMENT CHARACTERなど)があります。 PDFテキストの解析時に後者を取得