1

現在、私はiPhone 3.0 SDKを使用してObjective-Cで100%作成されているソフトウェアに取り組んでいます。

私はかなりの量または文字列の連結、より具体的にはNSStringの連結を行う必要がある交差点に到達しました。これまでのところ、次のようにしています。

Objective-Cの文字列連結:

NSString *resultantString = (NSMutableString*)[@"Hello " stringByAppendingString: @"World"];

ご想像のとおり、6つのNSStringを連結しようとすると、これを読むのが非常に難しくなります。

最初は、Objective-C ++クラスでミキシングして文字列の連結を行い、それをObjective-Cクラスに戻すことを検討しました。その後、次のようなC++の簡単な文字列連結を使用できます。

C ++文字列の連結:

string cppString = "Hello" + "World" + "see" + "easy!";

Cのchar配列を使用することもできますが、それは少し読みにくいでしょう。

次に、CocoaでPythonまたはRubyブリッジを使用できることに気付きました(これにより、正規表現の追加ボーナスと、Cベースの言語よりも優れた文字列処理が提供されます)。

文字列操作言語として請求されるため、RubyとPythonを少量しかコーディングしていなくても、これは私には理にかなっています。Perl Xcodeで直接サポートされていないため、スキップすることにしました。

パフォーマンスにも興味があるので、文字列の連結を行うための最速の方法を探しています。

だから私は何をすべきですか?一度に多くの文字列(たとえば10文字列)を連結するためにObjective-Cに欠けている非常に簡単な方法はありますか?または、連結または正規表現で変更された文字列を返すPythonまたはRubyクラスのメソッドを使用するという私の考えは、思ったほど狂っていませんか?おそらく私はこれを行うための別の方法を逃したことさえありますか?

更新: はい。特に速度に関心があることに気付いたので、文字列操作を行うために別の言語のランタイムを取り込むことを考えるのはかなり頭がおかしいようです。ブリッジの追加は、単にNSString/NSMutableStringを使用するよりもおそらくはるかに遅くなります。

4

5 に答える 5

9

固定サイズの連結の場合、次[NSString stringWithFormat:]のように使用できます。

NSString *str = [NSString stringWithFormat:@"%@ %@ %@",
                                  @"Hello", @"World", @"Yay!"];
于 2009-07-07T18:02:19.460 に答える
9

結合操作を使用できます。

NSArray *chunks  = ... get an array, say by splitting it;
string = [chunks componentsJoinedByString: @" :-) "];

oop :-) ack :-) bork :-) greeble :-) ポニーのようなものが生成されます

于 2009-07-07T18:04:24.653 に答える
4

NSMutableString クラスの appendString メソッドを見たことがありますか?

同じクラスの appendFormat を使用すると、本当に関心がある場合は、1 つのステートメントで多くの連結を行うことができます。

于 2009-07-07T17:59:54.257 に答える
3

特にPythonやRubyをよく知らない場合は、言語を混在させることは避けます. Objective-C で読み取り可能なコードを取得すると、独自のコード ベースを理解するために複数の言語を読む必要がなくなります。私には保守性の悪夢のようです。

Objective-C で直接これを行う方法の提案の 1 つを採用することを強くお勧めします。

于 2009-07-07T18:06:33.727 に答える
2

このためだけに C++ でドラッグするのは、非常に手間がかかるようです。stringWithFormat:他の人が示唆しているように、 NSStringまたはNSMutableStringで使用appendFormat:することは、はるかに自然であり、特に読みにくいものではありません。また、Cocoa で文字列を使用するには、C++ 文字列と相互に変換するコードを追加する必要があります。

于 2009-07-07T18:11:26.900 に答える