NSStringを連結するためのObjective-Cのショートカット


1129

stringByAppendingString:Objective-Cの()文字列連結へのショートカット、またはNSString一般的に使用するためのショートカットはありますか?

たとえば、私は作りたいと思います:

NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];

より多くのようなもの:

string myString = "This";
string test = myString + " is just a test";

4
連結演算子として「@ +」を提案したいのですが。Objective-Cの次のアップデート、kthxbaiでこれを期待します
powerj1984

44
@NicolasMiariこれは、Objective-Cに欠けている機能だけではありません。他にもたくさんあります。Jordãoが投稿したリンクからの引用:「Objective-Cは、率直に言って原始的な言語です。現代の言語と比較すると、すぐに不足していることがわかります。」同意する。Objective-C(1980年代前半)はC(1970年代初頭)であり、非常に単純でタイプセーフではない種類のOOPが追加されています。大丈夫ですが、JavaやC#と比べると、とても古臭く感じられます。
jcsahnwaldtはGoFundMonicaを2013

5
@NicolasMiari:解釈された言語?C#とJavaはコンパイルされた言語です。バイトコードにコンパイルされた後、マシンコードに再度コンパイルされます。
Joren

3
物事が変更されました:Swift(アップルの新しい言語)がより簡単になりました
Pradeep

6
「型安全」については、スタイルの問題だと思います。C#/ C ++から来た人にとって、あらゆる種類のオブジェクトの異種混合配列を持つことは奇妙に思えるかもしれませんが、Objective-C / Cocoaに慣れている人にとっては、それはダイナミズムと自由の形です。自分が何をしているのかを知っていれば、それは利点です。最近のプログラマーが最近打ちのめしているCのほとんどすべてと同じように
ニコラス・ミアリ2014

回答:


616

私が考えることのできる2つの答え...どちらも、連結演算子があるだけの場合ほど快適ではありません。

まず、メソッドNSMutableStringを持つを使用します。これappendStringにより、余分な一時文字列が不要になります。

次に、メソッドNSArrayを使用して連結するために使用しますcomponentsJoinedByString


34
他のオプションには多くの賛成票がありますが、構築時にすべての文字列がわからない場合は、これが最良の答えだと思います。文字列を追加するたびに、多くのオーバーヘッドが発生します。変更可能な文字列を使用すると、その問題が解消されます。
イーライ

22
+1同意するw @ Eli。これらは一般的に最良のソリューションです。NSArray -componentsJoinedByStringは1行でかなりうまく実行できます。string = [[NSArray arrayWithObjects:@ "This"、 "Is"、 "A"、 "Test"、nil] componentsJoinedByString:@ ""];
Rob Napier

4
この回答の+1。[NSMutableString appendString]よりメモリに優しいです[NSString stringByAppendingStrings]
Pierre-David Belanger、2011

2
@RobNapier:新しい配列リテラル構文により、さらに改善されました。
Amogh Talpallikar 2013

27
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];この技術は最もエレガントなようです。それが選択された答えであるべきです。
ekillaby 14

1129

オプション:

[NSString stringWithFormat:@"%@/%@/%@", one, two, three];

別のオプション:

複数のアペンド(a + b + c + d)に満足できないと思いますが、その場合は次のようにできます。

NSLog(@"%@", [Util append:one, @" ", two, nil]); // "one two"
NSLog(@"%@", [Util append:three, @"/", two, @"/", one, nil]); // three/two/one

のようなものを使用して

+ (NSString *) append:(id) first, ...
{
    NSString * result = @"";
    id eachArg;
    va_list alist;
    if(first)
    {
        result = [result stringByAppendingString:first];
        va_start(alist, first);
        while (eachArg = va_arg(alist, id)) 
        result = [result stringByAppendingString:eachArg];
        va_end(alist);
    }
    return result;
}

8
@pablasso同意する。Utilメソッドはかなり醜いです。このようなことをしたい場合は、+ stringByAppendingStrings:のような名前のNSStringカテゴリとして行う必要があります。NSStringForAppendedStrings(...)のような名前のまっすぐな関数でさえ、Utilのようなクラスの静的メソッドよりも優れています(名前に「Util」が含まれるものはすべて因数分解が不十分である可能性があります)。この関数は、NSMutableStringと-appendStringを使用して実装することで、一時的に自動解放されるNSStringの無制限のセットが作成されるのを回避できます。
Rob Napier

1
大きな文字列では、これはメモリを浪費する可能性があります。実際のプログラミング言語では、StringBuilderに近いものをお勧めします。その後、実際に追加を開始する前に、必要なメモリ量を把握することができます。上記のアプローチは、これを行うためにリファクタリングできます。ただし、StringBuilderオブジェクトを作成すると、ユーザーが結合する必要のあるすべての文字列のリストを追跡する必要がなくなるため、オブジェクトを作成する方が適切です。
ジョージ

Utilをどのようにインポートしますか?このIDEはイライラします(Eclipseのような "import something.Util"の提案はなく、どこにも "Util"についての言及はありません。これは自分でコーディングするクラスですか?
Gubatron

stringWithFormatは非常にエレガントであるだけでなく、はるかに強力です。@ "%@%@"と組み合わせて2つの文字列を連結し、@ "%@%@%@"を使用して3つの文字列を連結しますが、余分な文字を内部に配置したり、数値を出力したり、必要に応じてパラメーターを並べ替えたりできます。 。フォーマット文字列はローカライズできるため、10倍強力になります。文字列連結は初心者向けです。
gnasher729 2015

150

NSString リテラルが2つある場合は、次のようにすることもできます。

NSString *joinedFromLiterals = @"ONE " @"MILLION " @"YEARS " @"DUNGEON!!!";

これは、#definesに参加する場合にも役立ちます。

#define STRINGA @"Also, I don't know "
#define STRINGB @"where food comes from."
#define JOINED STRINGA STRINGB

楽しい。


13
@ CristiBăluță :)ただし、これはリテラルでのみ機能し、動的に作成されたNSStringインスタンスでは機能しません。
Johannes Fahrenkrug 2012年

9
実際には@、最初の文字列のs は必要ありません。@"I" " really" " enjoy"...
ケビン

おそらく、STRINGAとSTRINGBを括弧で囲んだほうがよいでしょう。そうしないと、マクロが解決されたときに奇妙な結果になる可能性があります。#define JOINED(STRINGA STRINGB)
digory doo

@JohannesFahrenkrugでは、なぜこれNSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";が機能しないのですか?私が持ってるExpected '@' in programのエラー:(
Vagif

@VagifはどのようにTABLE_NAME定義されていますか?
Johannes Fahrenkrug 2017

75

私はこの投稿に戻り続け、常に答えを並べ替えて、必要な数の変数で機能するこの単純なソリューションを見つけます:

[NSString stringWithFormat:@"%@/%@/%@", three, two, one];

例えば:

NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];

48

メソッドを作成します。

- (NSString *)strCat: (NSString *)one: (NSString *)two
{
    NSString *myString;
    myString = [NSString stringWithFormat:@"%@%@", one , two];
    return myString;
}

次に、必要な関数で、文字列またはテキストフィールドなどをこの関数の戻り値に設定します。

または、ショートカットを作成するには、NSStringをC ++文字列に変換し、そこで「+」を使用します。


これが最も簡単なソリューションです。
GeneCode、

44

コロンは、特殊記号の一種であるが、同様に、あるメソッドシグネチャの一部、それがextedすることが可能であるNSString。この追加するカテゴリを非慣用文字列連結のスタイルを:

[@"This " : @"feels " : @"almost like " : @"concatenation with operators"];

コロンで区切られた引数は、必要に応じていくつでも定義できます... ;-)

良い目安として、文字列の終了リストを受け取るconcat:変数引数も追加しましたnil

//  NSString+Concatenation.h

#import <Foundation/Foundation.h>

@interface NSString (Concatenation)

- (NSString *):(NSString *)a;
- (NSString *):(NSString *)a :(NSString *)b;
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c;
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c :(NSString *)d;

- (NSString *)concat:(NSString *)strings, ...;

@end

//  NSString+Concatenation.m

#import "NSString+Concatenation.h"

@implementation NSString (Concatenation)

- (NSString *):(NSString *)a { return [self stringByAppendingString:a];}
- (NSString *):(NSString *)a :(NSString *)b { return [[self:a]:b];}
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c
    { return [[[self:a]:b]:c]; }
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c :(NSString *)d
    { return [[[[self:a]:b]:c]:d];}

- (NSString *)concat:(NSString *)strings, ...
{
    va_list args;
    va_start(args, strings);

    NSString *s;    
    NSString *con = [self stringByAppendingString:strings];

    while((s = va_arg(args, NSString *))) 
        con = [con stringByAppendingString:s];

    va_end(args);
    return con;
}
@end

//  NSString+ConcatenationTest.h

#import <SenTestingKit/SenTestingKit.h>
#import "NSString+Concatenation.h"

@interface NSString_ConcatenationTest : SenTestCase

@end

//  NSString+ConcatenationTest.m

#import "NSString+ConcatenationTest.h"

@implementation NSString_ConcatenationTest

- (void)testSimpleConcatenation 
{
    STAssertEqualObjects([@"a":@"b"], @"ab", nil);
    STAssertEqualObjects([@"a":@"b":@"c"], @"abc", nil);
    STAssertEqualObjects([@"a":@"b":@"c":@"d"], @"abcd", nil);
    STAssertEqualObjects([@"a":@"b":@"c":@"d":@"e"], @"abcde", nil);
    STAssertEqualObjects([@"this " : @"is " : @"string " : @"concatenation"],
     @"this is string concatenation", nil);
}

- (void)testVarArgConcatenation 
{
    NSString *concatenation = [@"a" concat:@"b", nil];
    STAssertEqualObjects(concatenation, @"ab", nil);

    concatenation = [concatenation concat:@"c", @"d", concatenation, nil];
    STAssertEqualObjects(concatenation, @"abcdab", nil);
}

20
私は1年前にこれに反対票を投じました。多数の文字列の連結に対処するために、Palimondoの実装では、非常によく似た多数のメソッドを実装するか、メソッドを数回呼び出す必要があり、基本的に文字列を連結するだけの大量のコードが生成されます。このアプローチを使用すると、単純なを超えるメリットはありませんstringWithFormat:。非標準であるだけでなく、混乱を招くような名前付きパラメーターの欠如は言うまでもありません。
FreeAsInBeer 2013年

2
元の質問者はに言及してstringByAppendingStringおり、彼は2つ以上の引数を使用することについては何も述べていません。私はこの答えが受け入れられたものよりも好きです。それはかなり賢いです。
sudo 14

32

stringByAppendingString:この方法を使用します。

NSString *string1, *string2, *result;

string1 = @"This is ";
string2 = @"my string.";

result = [result stringByAppendingString:string1];
result = [result stringByAppendingString:string2];

または

result = [result stringByAppendingString:@"This is "];
result = [result stringByAppendingString:@"my string."];

34
あなたは彼がしたくない正確なことを提案していることに気づいていますよね?
SilverSideDown

こんなに漏れ!
RamGrg

30

大きい:

// stringConcat(...)
//     A shortcut for concatenating strings (or objects' string representations).
//     Input: Any number of non-nil NSObjects.
//     Output: All arguments concatenated together into a single NSString.

#define stringConcat(...) \
    [@[__VA_ARGS__] componentsJoinedByString:@""]

テストケース:

- (void)testStringConcat {
    NSString *actual;

    actual = stringConcat(); //might not make sense, but it's still a valid expression.
    STAssertEqualObjects(@"", actual, @"stringConcat");

    actual = stringConcat(@"A");
    STAssertEqualObjects(@"A", actual, @"stringConcat");

    actual = stringConcat(@"A", @"B");
    STAssertEqualObjects(@"AB", actual, @"stringConcat");

    actual = stringConcat(@"A", @"B", @"C");
    STAssertEqualObjects(@"ABC", actual, @"stringConcat");

    // works on all NSObjects (not just strings):
    actual = stringConcat(@1, @" ", @2, @" ", @3);
    STAssertEqualObjects(@"1 2 3", actual, @"stringConcat");
}

代替マクロ:(最小数の引数を強制したい場合)

// stringConcat(...)
//     A shortcut for concatenating strings (or objects' string representations).
//     Input: Two or more non-nil NSObjects.
//     Output: All arguments concatenated together into a single NSString.

#define stringConcat(str1, str2, ...) \
    [@[ str1, str2, ##__VA_ARGS__] componentsJoinedByString:@""];

2
しばらくこの質問をチェックしていませんが、私はここ数年の間にこれを正しい答えとして受け入れることに傾倒しています!
typeoneerror 2016年

1
これはまた、おそらく-[NSString stringByAppendingString:]このユースケースよりも動作が優れています。前者の場合、引数がある場合は例外が発生しますがnil、レシーバーがそうでない場合は例外になります。つまり、文字列フィーダーのエラーがサイレントに失敗する確率は50%、例外は50%と考えられます。ではstringConcat、あなたの任意の例外を保証しているnilどこかのリストに、。少なくともどちらかがより予測可能です。
トミー

27

Webサービスのリクエストを作成するとき、次のようなことは非常に簡単で、連結をXcodeで読みやすくすることがわかりました。

NSString* postBody = {
    @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
    @"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
    @" <soap:Body>"
    @"  <WebServiceMethod xmlns=\"\">"
    @"   <parameter>test</parameter>"
    @"  </WebServiceMethod>"
    @" </soap:Body>"
    @"</soap:Envelope>"
};

Objective-C noobの場合、この構文の機能を説明できますか?これは文字列の配列を作成し、どういうわけかそれらを結合していますか?ドキュメントへの参照もクールです。
ノーマンH

2
@NormanH:これは実際にはC言語の一部です。少し掘り下げた後、これを見つけることができました。「文字列の連結」フェーズで、隣接するすべての文字列とワイド文字列リテラルが連結されます。たとえば、「文字列」「連結」は「文字列連結」になります。
FreeAsInBeer

27

AppendString(AS)マクロを作成することによるショートカット...

#define AS(A、B)[(A)stringByAppendingString:(B)]
NSString * myString = @ "This"; NSString * test = AS(myString、@ "は単なるテストです");

注意:

マクロを使用する場合は、もちろん可変引数を使用して実行してください。EthanBの回答を参照してください。


涼しい!私はまだ上記のUtilがはるかにエレガントなソリューションだと思います。このマクロで追加できる文字列は1つだけですよね?
typeoneerror 2009

1
確かに、上記のASマクロはコード行ごとに1つの追加を行います。複数の追加が一般的なニーズである場合、より多くのマクロを作成できます。たとえば、2つの文字列を追加するマクロ:<pre> #define A2S(A、B、C)[[(A)stringByAppendingString:(B)] stringByAppendingString:(C)] </ pre>

2
または、「#define AS stringByAppendingString」のようなマクロで必要な入力を短くしてから、通常「stringByAppendingString」と入力するところに「AS」を使用するだけで、コード行ごとに複数の追加を楽しむことができます。

15
これらのマクロの問題は、それらがObjective-Cの主要な目標の1つである可読性を損なうことです。「AS」が何をするかは非常に不明確です。可読性を犠牲にしていくつかのキーストローク(そのほとんどはオートコンプリートで処理されます)を保存しても、適切なトレードオフになることはめったにありません。例外はありますが(@ ""構文は+ stringWithUTF8String:を毎回使用する必要があるよりはるかに読みやすいです)、目標は、単に簡潔にするのではなく、読みやすさである必要があります。あなたは一度書いても、永遠にデバッグします。
Rob Napier、

こんにちはロブ-私はこれに同意できません。確かに、「AS」は悪い名前です。おそらく「CAT」という名前にする必要があります。
Fattie

13
NSString *label1 = @"Process Name: ";
NSString *label2 = @"Process Id: ";
NSString *processName = [[NSProcessInfo processInfo] processName];
NSString *processID = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]];
NSString *testConcat = [NSString stringWithFormat:@"%@ %@ %@ %@", label1, processName, label2, processID];

11

新しい配列リテラル構文を使用した簡単な方法を次に示します。

NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                  ^^^^^^^ create array ^^^^^
                                               ^^^^^^^ concatenate ^^^^^

9
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];

Objective CIを使用して数年後、これがObjective Cと連携して、達成しようとしていることを達成するための最良の方法だと思います。

Xcodeアプリケーションで「N」を入力すると、「NSString」にオートコンプリートされます。「str」を入力すると、「stringByAppendingString」にオートコンプリートされます。したがって、キーストロークはかなり制限されています。

「@」キーを押して、読み取り可能なコードを書くプロセスをタブで叩くコツをつかんだら、問題にはなりません。それは単に適応の問題です。


あなたは彼が望んでいない正確なことを提案していることに気づきます
ユーザーではないユーザー

8

c = [a stringByAppendingString: b]短くする唯一の方法は、そのst時点でオートコンプリートを使用することです。+オペレータは、Objective-Cのオブジェクトについて知らないC、の一部です。


あなたは彼がしたくない正確なことを提案していることに気づいていますよね?少なくとも、を#define使用して短縮できます。
ユーザーではないユーザー

8

短縮はどうですか stringByAppendingStringと使います。#defineを

#define and stringByAppendingString

したがって、以下を使用します。

NSString* myString = [@"Hello " and @"world"];

問題は、2つの文字列に対してのみ機能することです。追加の括弧を追加するには、追加のブラケットをラップする必要があります。

NSString* myString = [[@"Hello" and: @" world"] and: @" again"];

XCode7では、このオプションを使用できなくなります。「and」は予約語です。ただし、連結の代わりに「cat」を使用できます。私はそうしました、そしてあなたの解決策は完全に機能し、非常に簡単です。
Volomike、2016年

8
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];

7
NSString *label1 = @"Process Name: ";
NSString *label2 = @"Process Id: ";
NSString *processName = [[NSProcessInfo processInfo] processName];
NSString *processID = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]];
NSString *testConcat = [NSString stringWithFormat:@"%@ %@ %@ %@", label1, processName, label2, processID];

6

私はこのコードを試しました。それは私のために働いた。

NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];

2
これは、これまででNSMutableStringの最悪の悪用です。NSMutableStringの要点は、自動解放された文字列を作成するメソッドは必要ありませんが、文字列自体を変更できることです。
gnasher729 2015

同意します。少なくともを使用してappendString:いる場合は使用してくださいNSMutableString
ユーザーではないユーザー

6

lldbペインで次のことを試していました

[NSString stringWithFormat:@"%@/%@/%@", three, two, one];

どのエラー。

代わりにallocとinitWithFormatmethodを使用します。

[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];

1
...コメントするには十分な評判がありましたが、これが他の誰かの役に立つことを願っています。
Anthony De Souza

4

これは、より良いロギングとロギングのみのためです-diciusの優れた複数引数メソッドに基づいています。Loggerクラスを定義して、次のように呼び出します。

[Logger log: @"foobar ", @" asdads ", theString, nil];

var argsを「nil」で終わらせる必要があることを除いて、ほとんど問題ありませんが、Objective-Cにはそれを回避する方法はないと思います。

Logger.h

@interface Logger : NSObject {
}
+ (void) log: (id) first, ...;
@end

Logger.m

@implementation Logger

+ (void) log: (id) first, ...
{
    // TODO: make efficient; handle arguments other than strings
    // thanks to @diciu http://stackoverflow.com/questions/510269/how-do-i-concatenate-strings-in-objective-c
    NSString * result = @"";
    id eachArg;
    va_list alist;
    if(first)
    {
        result = [result stringByAppendingString:first];
        va_start(alist, first);
        while (eachArg = va_arg(alist, id)) 
        {
            result = [result stringByAppendingString:eachArg];
        }
        va_end(alist);
    }
    NSLog(@"%@", result);
}

@end 

文字列のみを連結するために、NSStringにカテゴリを定義し、静的(+)連結メソッドを追加します。これは、文字列を返すことを除いて、上記のログメソッドとまったく同じように見えます。これはNSStringにあります。これは文字列メソッドであるためです。また、追加の一部である文字列の1つではなく、1-N文字列から新しい文字列を作成するために静的です。


4
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];

3

stringWithFormatを試してください:

NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];

なぜこれには2つの反対票があるのですか?これは別の回答ですでに言及されていたからですか?
Reimius

3

文字列を扱う場合、ソースファイルをObjC ++にする方が簡単だと思うことが多いので、質問に示されている2番目の方法を使用してstd :: stringsを連結できます。

std::string stdstr = [nsstr UTF8String];

//easier to read and more portable string manipulation goes here...

NSString* nsstr = [NSString stringWithUTF8String:stdstr.c_str()];

3

私の好ましい方法はこれです:

NSString *firstString = @"foo";
NSString *secondString = @"bar";
NSString *thirdString = @"baz";

NSString *joinedString = [@[firstString, secondString, thirdString] join];

カテゴリを使用してNSArrayにjoinメソッドを追加することで、これを実現できます。

#import "NSArray+Join.h"
@implementation NSArray (Join)
-(NSString *)join
{
    return [self componentsJoinedByString:@""];
}
@end

@[] それはの短い定義です NSArray。これが文字列を連結する最速の方法だと思います。

カテゴリを使用したくない場合は、componentsJoinedByString:メソッドを直接使用します。

NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""];

3

NSArrayは次のように使用できます

NSString *string1=@"This"

NSString *string2=@"is just"

NSString *string3=@"a test"  

NSArray *myStrings = [[NSArray alloc] initWithObjects:string1, string2, string3,nil];

NSString *fullLengthString = [myStrings componentsJoinedByString:@" "];

または

あなたは使うことができます

NSString *imageFullName=[NSString stringWithFormat:@"%@ %@ %@.", string1,string2,string3];

1

私がテストしたとき、これらの形式のいずれかがXCode7で機能します。

NSString *sTest1 = {@"This" " and that" " and one more"};
NSString *sTest2 = {
  @"This"
  " and that"
  " and one more"
};

NSLog(@"\n%@\n\n%@",sTest1,sTest2);

何らかの理由で、ミックスの最初の文字列に@演算子文字のみが必要です。

ただし、変数の挿入では機能しません。そのため、「and」の代わりに「cat」でマクロを使用することを除いて、この非常にシンプルなソリューションを使用できます。


これを作る方法?例:sTest3 = sTest1 + sTest2;

@ user285594それが問題のポイントでした。その構文はObjective-Cでは許可されていません。他の答えを見てください。
ユーザーではないユーザー

1

UIテストでこれを必要とするすべてのObjective C愛好家のために:

-(void) clearTextField:(XCUIElement*) textField{

    NSString* currentInput = (NSString*) textField.value;
    NSMutableString* deleteString = [NSMutableString new];

    for(int i = 0; i < currentInput.length; ++i) {
        [deleteString appendString: [NSString stringWithFormat:@"%c", 8]];
    }
    [textField typeText:deleteString];
}

0
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];

0

そこに文字列がいくつあるかわからないとしましょう。

NSMutableArray *arrForStrings = [[NSMutableArray alloc] init];
for (int i=0; i<[allMyStrings count]; i++) {
    NSString *str = [allMyStrings objectAtIndex:i];
    [arrForStrings addObject:str];
}
NSString *readyString = [[arrForStrings mutableCopy] componentsJoinedByString:@", "];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.