30 Pertanyaan: Pintasan di Objective-C untuk menggabungkan NSStrings

pertanyaan dibuat di Sat, Jan 7, 2017 12:00 AM

Apakah ada pintasan ke (stringByAppendingString:) rangkaian string di Objective-C, atau pintasan untuk bekerja dengan NSString secara umum?

Misalnya, saya ingin membuat:

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

sesuatu yang lebih seperti:

 
string myString = "This";
string test = myString + " is just a test";
    
1090
  1. Saya hanya ingin mengusulkan '@ +' sebagai operator gabungan. Saya akan mengharapkan ini di pembaruan berikutnya ke Objective-C, kthxbai
    2013-01-15 20: 15: 34Z
  2. @ NicolasMiari Ini bukan satu-satunya fitur yang tidak dimiliki Objective-C. Ada lusinan lainnya. Mengutip dari tautan Yordania yang diposkan: "Objective-C adalah, untuk menjadi tumpul, bahasa primitif. Bandingkan dengan bahasa modern mana pun dan Anda dengan cepat merasa kurang. " Saya setuju. Objective-C (awal 1980-an) adalah C (awal 1970-an) dengan tambahan jenis OOP yang sangat sederhana dan tidak terlalu aman. Tidak apa-apa, tetapi dibandingkan dengan Java atau C #, rasanya sangat kuno.
    2013-08-15 09: 13: 26Z
  3. @ NicolasMiari: Bahasa yang ditafsirkan? C # dan Java adalah bahasa yang dikompilasi. Dikompilasi menjadi bytecode, yang kemudian dikompilasi lagi ke kode mesin.
    2013-09-16 11: 20: 48Z
  4. Segalanya berubah sekarang: Swift (bahasa baru apple) lebih mudah
    2014-06-11 19: 45: 59Z
  5. Mengenai "type safety", saya pikir ini masalah gaya. Untuk seseorang yang datang dari C # /C ++, memiliki array objek yang heterogen dari jenis apa pun mungkin tampak aneh, tetapi bagi seseorang yang terbiasa dengan Objective-C /Cocoa, itu adalah bentuk dinamisme dan kebebasan; ini adalah keuntungan asalkan Anda tahu apa yang Anda lakukan. Seperti hampir semua hal tentang C yang programmer bash hari ini ...
    2014-07-18 01: 11: 06Z
30 Jawaban                              30                         

Dua jawaban yang bisa saya pikirkan ... tidak satu pun yang menyenangkan seperti memiliki operator gabungan.

Pertama, gunakan NSMutableString, yang memiliki metode appendString, hapus beberapa kebutuhan untuk string temp tambahan.

Kedua, gunakan NSArray untuk digabungkan melalui metode componentsJoinedByString.

    
602
2012-03-22 03: 12: 57Z
  1. Meskipun opsi lain memiliki banyak upvotes, saya pikir ini adalah jawaban terbaik jika Anda tidak tahu semua string Anda tentang konstruksi. Setiap kali Anda menambahkan string, Anda membuat banyak overhead. Menggunakan string yang dapat berubah menghapus masalah itu.
    2009-12-22 01: 25: 36Z
  2. + 1 Setuju dengan @Eli. Ini umumnya merupakan solusi terbaik. NSArray -componentsJoinedByString dapat dilakukan dalam satu baris dengan cukup baik: string = [[NSArray arrayWithObjects: @ "This", "Is", "A", "Test", nil] componentsJoinedByString: @ ""];
    2010-02-16 14: 37: 28Z
  3. +1 untuk jawaban ini. [NSMutableString appendString] lebih ramah memori daripada [NSString stringByAppendingStrings].
    2011-09-27 14: 22: 26Z
  4. @ RobNapier: Sekarang dengan sintaks literal array baru, ini bahkan lebih baik.
    2013-07-02 07: 12: 22Z
  5. Teknik [NSString stringWithFormat:@"%@/%@/%@", three, two, one]; tampaknya paling elegan. Itu harus menjadi jawaban yang dipilih.
    2014-02-21 19: 39: 45Z

Opsi:

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

Opsi lain:

Saya menduga Anda tidak puas dengan beberapa penambahan (a + b + c + d), yang dapat Anda lakukan:

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

menggunakan sesuatu seperti

 
+ (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;
}
    
1100
2014-10-17 22: 18: 42Z
  1. @ pablasso Setuju. Metode Util sangat jelek. Jika Anda menginginkan hal seperti itu, itu harus dilakukan sebagai kategori NSString dengan nama seperti + stringByAppendingStrings :. Bahkan fungsi straight-up dengan nama seperti NSStringForAppendedStrings (...) akan lebih baik daripada metode statis di kelas seperti Util (apa pun dengan "Util" dalam nama tersebut kemungkinan besar memiliki faktor buruk). Fungsi ini juga lebih baik diimplementasikan dengan NSMutableString dan -appendString untuk menghindari pembuatan set NSStrings autoreleased sementara yang tidak dibatasi.
    2010-02-16 14: 34: 10Z
  2. Dengan string besar ini dapat membuang-buang memori. Direkomendasikan lebih mirip StringBuilder dalam bahasa pemrograman nyata. Maka Anda bisa mencari tahu berapa banyak memori yang dibutuhkan sebelum Anda benar-benar mulai menambahkan. Pendekatan di atas dapat di refactored untuk melakukan ini. Namun, akan lebih baik untuk membuat objek StringBuilder karena ini akan menyelamatkan pengguna agar tidak harus melacak daftar semua string yang mereka perlu kombinasikan.
    2011-10-12 23: 57: 06Z
  3. bagaimana Anda mengimpor Util? IDE ini membuat frustrasi (tidak disarankan "impor sesuatu. Gunakan" seperti pada gerhana, dan saya tidak menemukan menyebutkan "Util" di mana pun. Apakah ini kelas yang seharusnya saya kodekan sendiri?
    2014-09-19 23: 48: 38Z
  4. stringWithFormat tidak hanya sangat elegan, tetapi juga jauh lebih kuat. Anda menggunakannya dengan @ "% @% @" untuk menggabungkan dua string, @ "% @% @% @" untuk menggabungkan tiga string, tetapi Anda dapat memasukkan karakter tambahan ke dalam, mencetak nomor, menyusun ulang parameter jika Anda suka dan sebagainya. . String format dapat dilokalkan, membuatnya sepuluh kali lebih kuat. Rangkaian string adalah untuk pemula.
    2015-04-28 18: 37: 00Z

Jika Anda memiliki 2 NSString literal , Anda juga dapat melakukan ini:

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

Itu juga berguna untuk bergabung dengan #defines:

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

Selamat menikmati.

    
147
2013-12-20 14: 54: 53Z
  1. @ CristiBăluță :) Tapi ini hanya berfungsi dengan literal tidak dengan instance NSString yang dibuat secara dinamis.
    2012-11-23 19: 23: 17Z
  2. Anda sebenarnya tidak membutuhkan @ s pada string setelah yang pertama. @"I" " really" " enjoy"...
    2013-05-11 17: 49: 01Z
  3. Anda mungkin ingin meletakkan STRINGA dan STRINGB dalam tanda kurung, jika tidak, Anda mungkin mendapatkan hasil yang aneh ketika makro diselesaikan. #define BERGABUNG (STRINGA STRINGB)
    2013-07-30 17: 04: 46Z
  4. @ JohannesFahrenkrug Lalu mengapa NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);"; ini tidak berfungsi? Saya mengalami kesalahan Expected '@' in program :(
    2017-06-01 19: 56: 41Z
  5. @ Vagif bagaimana definisi TABLE_NAME?
    2017-06-06 15: 56: 56Z

Saya terus kembali ke pos ini dan selalu menyortir jawaban untuk menemukan solusi sederhana ini yang berfungsi dengan banyak variabel sesuai kebutuhan:

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

Misalnya:

 
NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];
    
69
2014-03-20 05: 20: 01Z

Yah, karena titik dua adalah jenis simbol khusus, tetapi adalah bagian dari tanda tangan metode, dimungkinkan untuk memperluas NSString dengan kategori untuk menambahkan gaya non-idiomatis ini penggabungan string:

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

Anda dapat mendefinisikan sebanyak mungkin argumen yang dipisahkan oleh titik dua yang berguna ... ;-)

Untuk ukuran yang baik, saya juga menambahkan concat: dengan argumen variabel yang mengambil nil daftar string yang diakhiri.

 
//  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);
}
    
43
2012-03-19 09: 20: 49Z
  1. Saya menurunkan ini setahun yang lalu karena itu bukan jawaban yang sangat baik. Untuk mengatasi penggabungan sejumlah besar string, implementasi Palimondo membutuhkan penerapan sejumlah besar metode yang tampak sangat mirip, atau memanggil metode beberapa kali, menghasilkan sejumlah besar kode yang pada dasarnya hanya menggabungkan string. Dengan menggunakan pendekatan ini, Anda tidak mendapatkan manfaat apa pun dari yang sederhana stringWithFormat:. Belum lagi kurangnya parameter bernama yang tidak hanya non-standar tetapi juga membingungkan.
    2013-03-26 12: 57: 45Z
  2. Penanya awal menyebutkan stringByAppendingString, dan dia tidak pernah mengatakan apa-apa tentang menggunakan lebih dari dua argumen. Saya suka jawaban ini lebih baik daripada yang diterima. Cukup pintar.
    2014-07-09 17: 00: 14Z

Buat metode:

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

Lalu, dalam fungsi apa pun yang Anda perlukan, setel string atau bidang teks Anda atau apa pun dengan nilai pengembalian fungsi ini.

Atau, untuk membuat jalan pintas, ubah NSString menjadi string C ++ dan gunakan '+' di sana.

    
37
2018-12-06 04: 30: 50Z
  1. Ini adalah solusi paling sederhana.
    2018-10-06 10: 00: 56Z

Gunakan cara ini:

 
NSString *string1, *string2, *result;

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

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

ATAU

 
result = [result stringByAppendingString:@"This is "];
result = [result stringByAppendingString:@"my string."];
    
32
2012-02-23 17: 15: 04Z
  1. Anda benar-benar menyadari bahwa Anda menyarankan hal yang persis dia ingin tidak dilakukan, bukan?
    2012-07-24 14: 57: 01Z

 

// 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:@""]

Uji Kasus:

 
- (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");
}

Alternatif makro: (jika Anda ingin menerapkan jumlah argumen minimum)

 
// 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:@""];
    

29
2013-05-31 17: 07: 51Z
  1. Belum sempat memeriksa pertanyaan ini, tapi saya condong ke arah menerima ini sebagai jawaban yang tepat setelah bertahun-tahun!
    2016-01-29 06: 25: 33Z
  2. Ini juga bisa dikatakan memiliki perilaku yang lebih baik daripada -[NSString stringByAppendingString:] untuk kasus penggunaan ini - dengan yang pertama Anda akan mendapatkan pengecualian jika argumennya adalah nil tetapi tidak jika menerimar adalah. Jadi kemungkinan 50% kemungkinan kesalahan pada pengumpan string Anda gagal secara diam-diam dan 50% sebagai pengecualian. Dengan stringConcat Anda dijamin pengecualian pada nil, di mana saja dalam daftar. Paling tidak lebih mudah diprediksi.
    2016-09-19 20: 46: 14Z

Saat membuat permintaan untuk layanan web, saya menemukan melakukan sesuatu seperti yang berikut ini sangat mudah dan membuat rangkaian dapat dibaca dalam 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>"
};
    
27
2012-03-16 14: 24: 43Z
  1. Untuk obyektif-c, bisakah Anda menjelaskan apa yang sedang dilakukan sintaksis ini? Apakah ini menciptakan array string dan bergabung dengannya entah bagaimana? Referensi ke dokumen apa pun juga akan keren.
    2012-05-25 13: 05: 08Z
  2. @ NormanH: Ini sebenarnya bagian dari bahasa C. Setelah menggali sedikit, saya dapat menemukan ini . Ini menyatakan di bawah fase "String concatenation": Semua string yang bersebelahan dan string lebar-string digabungkan. Misalnya, "String" "concatenation" menjadi "String concatenation".
    2012-05-25 18: 58: 30Z

Pintasan dengan membuat makro AppendString (AS) ...

 
#define AS(A,B)    [(A) stringByAppendingString:(B)]
NSString *myString = @"This"; NSString *test = AS(myString,@" is just a test");

Jika menggunakan makro, tentu saja lakukan dengan argumen variadik, lihat jawaban EthanB.

    
24
2017-12-14 10: 03: 18Z
  1. Keren! Saya masih berpikir Util di atas adalah solusi yang jauh lebih elegan; Anda hanya dapat menambahkan satu string dengan makro ini, bukan?
    2009-07-18 13: 02: 46Z
  2. Benar, makro AS di atas melakukan satu penambahan per baris kode. Jika beberapa penambahan adalah kebutuhan umum, maka lebih banyak makro dapat dibuat. Misalnya, makro untuk menambahkan dua string: < pre > #define A2S (A, B, C) [[(A) stringByAppendingString: (B)] stringByAppendingString: (C)] < /pre >
    2009-07-18 23: 54: 12Z
  3. Atau, cukup perpendek pengetikan yang diperlukan dengan makro seperti "#define AS stringByAppendingString", lalu gunakan "AS" di mana biasanya Anda mengetik "stringByAppendingString", dan nikmati beberapa menambahkan per baris kode.
    2009-07-19 00: 02: 17Z
  4. Masalah dengan makro ini adalah bahwa mereka merusak salah satu tujuan utama Objective-C, yaitu keterbacaan. Sangat tidak jelas apa yang "AS" lakukan. Menyimpan beberapa penekanan tombol (yang sebagian besar ditangani dengan pelengkapan otomatis) dengan biaya keterbacaan jarang merupakan pertukaran yang baik. Ada pengecualian (sintaks @ "" jauh lebih mudah dibaca daripada harus menggunakan + stringWithUTF8String: setiap kali), tetapi tujuannya harus tetap keterbacaan daripada hanya singkatnya. Anda menulis sekali, tetapi Anda melakukan debug selamanya.
    2010-02-16 14: 42: 41Z
  5. Hai Rob - Saya tidak setuju dengan Anda dalam hal ini. Tentu, "AS" adalah nama yang buruk. Itu harus dinamai mungkin "CAT".
    2015-12-18 02: 49: 30Z
 
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];
    
13
2010-06-10 09: 58: 30Z

Berikut cara sederhana, menggunakan sintaks literal array baru:

 
NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                  ^^^^^^^ create array ^^^^^
                                               ^^^^^^^ concatenate ^^^^^
    
10
2012-08-30 02: 29: 57Z
 
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];

Setelah beberapa tahun sekarang dengan Objective C saya pikir ini adalah cara terbaik untuk bekerja dengan Objective C untuk mencapai apa yang Anda coba capai.

Mulai memasukkan "N" di aplikasi Xcode Anda dan lengkapi otomatis ke "NSString". masukkan "str" ​​dan lengkapi otomatis ke "stringByAppendingString". Jadi penekanan tombolnya sangat terbatas.

Setelah Anda terbiasa menekan tombol "@" dan menabrak proses penulisan kode yang dapat dibaca tidak lagi menjadi masalah. Ini hanya masalah adaptasi.

    
9
2013-08-01 13: 13: 10Z

Satu-satunya cara untuk membuat c = [a stringByAppendingString: b] lebih pendek adalah dengan menggunakan pelengkapan otomatis di sekitar titik st. Operator + adalah bagian dari C, yang tidak tahu tentang objek Objective-C.

    
8
2009-02-04 07: 25: 32Z

Bagaimana dengan memperpendek stringByAppendingString dan menggunakan #define :

 
#define and stringByAppendingString

Dengan demikian Anda akan menggunakan:

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

Masalahnya adalah ini hanya berfungsi untuk dua string, Anda diharuskan membungkus tanda kurung tambahan untuk lebih banyak tambahan:

 
NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
    
8
2012-07-03 22: 36: 29Z
  1. [someObject callMethodWith: xxx dan: yyy dan: zzz] tiba-tiba berhenti berfungsi ...
    2015-04-28 18: 40: 03Z
  2. XCode7 tidak akan membiarkan Anda menggunakan opsi ini lagi - mengatakan "dan" adalah kata yang dilindungi undang-undang. Namun, Anda dapat menggunakan "cat" sebagai gantinya, untuk conCATenation. Saya lakukan dan solusi Anda bekerja dengan sempurna dan sangat sederhana.
    2016-01-28 20: 10: 28Z
 
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
    
8
2013-04-29 07: 53: 24Z
 
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];
    
7
2009-06-24 01: 09: 13Z

Saya mencoba kode ini. ini berfungsi untuk saya.

 
NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];
    
6
2013-06-02 19: 55: 32Z
  1. Ini adalah penyalahgunaan terburuk dari NSMutableString yang pernah ada. Inti dari NSMutableString adalah Anda tidak perlu metode membuat string autoreleased tetapi dapat memodifikasi string itu sendiri.
    2015-04-28 18: 41: 22Z

Sedang mencoba yang berikut di panel lldb

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

kesalahan apa.

alih-alih gunakan metode alokasi dan initWithFormat:

 
[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
    
6
2014-08-03 04: 37: 42Z
  1. ... berharap saya memiliki reputasi yang cukup untuk berkomentar tetapi berharap ini membantu orang lain.
    2014-04-07 11: 46: 36Z

Ini untuk pencatatan yang lebih baik, dan pencatatan hanya - berdasarkan metode argumen berganda excellent dicius. Saya mendefinisikan kelas Logger, dan menyebutnya seperti:

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

Hampir bagus, kecuali harus mengakhiri var args dengan "nil" tapi kurasa tidak ada jalan lain di 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 

Agar hanya string concat , saya akan mendefinisikan Kategori di NSString dan menambahkan metode gabungan statis (+) padanya yang terlihat persis seperti metode log di atas kecuali mengembalikan string. Ada di NSString karena ini adalah metode string, dan ini statis karena Anda ingin membuat string baru dari string 1-N, tidak menyebutnya di salah satu string yang merupakan bagian dari append.

    
4
2011-03-23 ​​17: 37: 16Z
 
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];
    
4
2016-01-20 13: 42: 37Z

Coba stringWithFormat:

 
NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
    
3
2012-11-11 18: 28: 04Z
  1. Mengapa ini memiliki 2 downvotes? Apakah karena ini sudah disebutkan dalam jawaban lain?
    2012-11-30 16: 32: 03Z

Ketika berurusan dengan string sering kali saya merasa lebih mudah membuat file sumber ObjC ++, maka saya dapat menggabungkan std :: string menggunakan metode kedua yang ditunjukkan dalam pertanyaan.

 
std::string stdstr = [nsstr UTF8String];

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

NSString* nsstr = [NSString stringWithUTF8String:stdstr.c_str()];
    
3
2012-11-14 13: 41: 42Z

Metode pilihan saya adalah ini:

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

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

Anda dapat mencapainya dengan menambahkan metode bergabung ke NSArray dengan kategori:

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

@[] itu adalah definisi singkat untuk NSArray, saya pikir ini adalah metode tercepat untuk menyatukan string.

Jika Anda tidak ingin menggunakan kategori, gunakan langsung metode componentsJoinedByString::

 
NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""];
    
3
2013-05-03 17: 29: 12Z

Anda dapat menggunakan NSArray sebagai

 
NSString *string1=@"This"

NSString *string2=@"is just"

NSString *string3=@"a test"  

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

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

atau

Anda dapat menggunakan

 
NSString *imageFullName=[NSString stringWithFormat:@"%@ %@ %@.", string1,string2,string3];
    
3
2013-05-17 05: 32: 10Z

Salah satu dari format ini berfungsi di XCode7 ketika saya menguji:

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

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

Untuk beberapa alasan, Anda hanya perlu karakter @ operator pada string pertama campuran.

Namun, itu tidak berfungsi dengan penyisipan variabel. Untuk itu, Anda dapat menggunakan solusi yang sangat sederhana ini dengan pengecualian menggunakan makro pada "cat" bukannya "dan" .

    
1
2017-05-23 12: 34: 45Z
  1. bagaimana membuatnya? mis.: sTest3 = sTest1 + sTest2;
    2017-03-08 20: 21: 03Z

Untuk semua pecinta Objective C yang membutuhkan ini di UI-Test:

 
-(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];
}
    
1
2016-06-07 08: 45: 00Z
 
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];
    
0
2013-01-22 04: 10: 27Z

Di Swift

 
let str1 = "This"
let str2 = "is just a test"

var appendStr1 = "\(str1) \(str2)" // appendStr1 would be "This is just a test"
var appendStr2 = str1 + str2 // // appendStr2 would be "This is just a test"

Juga, Anda dapat menggunakan operator += untuk hal yang sama seperti di bawah ini ...

 
var str3 = "Some String" 
str3 += str2            // str3 would be "Some String is just a test"
    
0
2016-03-03 08: 48: 57Z
  1. Swift: di luar topik (lihat judul pertanyaan, detail pertanyaan, dan tag).
    2017-12-06 19: 06: 08Z

Mari kita bayangkan bahwa Anda tidak tahu berapa banyak string di sana.

 
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:@", "];
    
0
2016-05-27 08: 08: 35Z
sumber ditempatkan sini