web-dev-qa-db-ja.com

NSStringの最後の文字を確認する方法

Objective CのNSString *について質問したいのですが、NSString *オブジェクトの最後の文字を確認できますか?

例:

NSString* data = @"abcde,";

if(data is end with ',') // I don't know this part
  // do sth

どうもありがとうございました。

60
Questions
NSString *data = @"abcde,";
if([data hasSuffix:@","]) // This returns true in this example
    // do something
165
robinjam

NSStringプログラミングガイド の推奨事項:

文字列に特定のパターンが含まれているかどうかを単に確認する場合は、述語を使用できます。

したがって、あなたの例では:

NSString *data = @"abcde,";

// Create the predicate
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"SELF endswith %@", @","];

// Run the predicate
// match == YES if the predicate is successful
BOOL match = [myPredicate evaluateWithObject:data];

// Do what you want
if (match) {
    // do something
}

書くのに少し時間がかかりましたか?たぶん、しかし、これを複数の場所で行うと、ヘルパーメソッドに簡単にリファクタリングできます。

NSPredicate docs へのリンクです。

編集

私はいくつかのプロファイリングを行いましたが、この単純なケースではやり過ぎです(以下のコメントを参照)。とにかく、この種のことのために述語を使用する例として、答えをここに残します。

5
Abizern

パフォーマンスが心配で、1つの文字を確認したい場合は、-characterAtIndex:メソッドを使用した方が高速です。 -hasSuffix:文字列をとるので、単一の文字をチェックするよりも多くの作業を行う必要がある可能性があります(違いは些細なことかもしれませんが)。

カテゴリを使用して、次のようにNSStringにメソッドを追加することもできます。

@interface NSString(StringUtilities)
    - (BOOL) endsWithCharacter: (unichar) c;
@end

@implementation NSString(StringUtilities)

    - (BOOL) endsWithCharacter: (unichar) c
    {
        NSUInteger length = [self length];
        return (length > 0) && ([self characterAtIndex: length - 1] == c);
    }

@end

// test it...
NSString *data = @"abcd,";
if ([data endsWithCharacter: L','])
{

}

もちろん、プロファイルを作成する必要があります。ただし、endsWithCharacterをメソッドに追加することにより、オーバーヘッドを渡すメッセージが追加され、代替のプロファイリング時に同じことをしない限り、プロファイリングの結果が歪むことに注意してください。

ほとんどすべての場合、これはおそらく時期尚早な最適化ですが、もちろん、このテストを1秒間に数千回実行する場合、それは重要かもしれません(その場合、メッセージの受け渡しとしてループ内でコードを直接使用したいでしょうタイトな内側のループの内側は素晴らしい計画ではありません)。

4
Sam Deane