2

私はObjectiveCとiOSの開発を学んでいます。Javaクラスで行ったプロジェクトのいくつかを再現しようとしていますが(完全に異なることはわかっています)、プロジェクトの1つで問題が発生しています。ある日、研究室でシーザーシフトを行っていました。文字列操作ラボ。これはJavaでは本当に基本的な取引でした...文字列をループして各文字を変更するためのforループです。Objective Cで個々の文字を変更する方法が見つからないようです。NSMutableStringのドキュメントとNSStringのドキュメントを調べたところ、次のことができることがわかりました。

[NSString stringByReplacingCharactersInRange:(NSRange *) withString:(NSString *)

しかし、何に置き換えるのかわからないので、それは実際には役に立ちません。特定のインデックスでキャラクターをつかんで変更する方法を見つける必要があります。何か案は?

4

2 に答える 2

2

[NSString characterAtIndex:(NSUInteger)]あなたが方法を探しているように聞こえます

例えば

NSString *string = @"abcde";
NSString *character = [NSString stringWithFormat:@"%C",[string characterAtIndex: 0]];
NSLog(@"%@", character);

結果:a

これとを使用して、NSMutableString必要な文字列を作成できます。

を使用して、の最後に追加appendStringできますNSMutableString

于 2012-06-19T00:29:05.660 に答える
1

おそらくこれを行うための最良の方法は、古き良きC文字列を使用することです。これにより、毎回異なる文字列を再割り当てするオーバーヘッドなしにバイトを変更できます。

NSString *ceasarShift(NSString *input)
{
    char *UTF8Str = strdup([input UTF8String]);

    int length = [input length];
    for (int i = 0; i < length; i++)
    {
         UTF8Str[i] = changeValueOf(UTF8Str[i]); // some code here to change the value
    }

    NSString *result = [NSString stringWithUTF8String:UTF8Str];
    free(UTF8Str);

    return result;
}

これによりオーバーヘッドが削減され、完了時に割り当てたデータを解放する必要がありますが、高レベルのAPIに依存しないという利点があり、パフォーマンスが大幅に向上します。(配列セットと動的メソッドルックアップの違いは、最大5 CPUサイクルです。これは、主要な種類の暗号化を実行している場合に多くのことを意味します)

ランダムが結果文字列に表示される可能性があるため、おそらくNSMutableData、の代わりにこの種のタスクを調べることもできます。NSString\0

于 2012-06-19T00:52:23.467 に答える