Pintasan di Objective-C untuk menggabungkan NSStrings

1129

Apakah ada pintasan ke ( stringByAppendingString:) rangkaian string di Objective-C, atau pintasan untuk bekerja NSStringsecara 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";
typeoneerror
sumber
4
Saya hanya ingin mengusulkan '@ +' sebagai operator gabungan. Saya akan mengharapkan ini di pembaruan berikutnya ke Objective-C, kthxbai
powerj1984
44
@NicolasMiari Ini bukan satu-satunya fitur yang kurang Objective-C. Ada lusinan lainnya. Mengutip dari tautan yang diposting Jordão: "Objective-C adalah, terus terang, bahasa primitif. Bandingkan dengan bahasa modern apa 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.
jcsahnwaldt mengatakan GoFundMonica
5
@NicolasMiari: Bahasa yang diterjemahkan? C # dan Java adalah bahasa yang dikompilasi. Dikompilasi menjadi bytecode, yang kemudian dikompilasi lagi ke kode mesin.
Joren
3
Segalanya berubah sekarang: Swift (bahasa baru apel) lebih mudah
Pradeep
6
Mengenai "keamanan jenis", 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 bash hari ini ...
Nicolas Miari

Jawaban:

616

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

Pertama, gunakan NSMutableString, yang memiliki appendStringmetode, menghapus beberapa kebutuhan untuk string temp tambahan.

Kedua, gunakan a NSArrayuntuk menggabungkan melalui componentsJoinedByStringmetode.

Chris Blackwell
sumber
34
Meskipun opsi lain memiliki banyak upvotes, saya pikir ini adalah jawaban terbaik jika Anda tidak tahu semua hal tentang konstruksi. Setiap kali Anda menambahkan string, Anda membuat banyak overhead. Menggunakan string yang dapat berubah menghapus masalah itu.
Eli
22
+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: @ ""];
Rob Napier
4
+1 untuk jawaban ini. [NSMutableString appendString]lebih ramah memori daripada [NSString stringByAppendingStrings].
Pierre-David Belanger
2
@RobNapier: Sekarang dengan sintaks literal array baru, itu bahkan lebih baik.
Amogh Talpallikar
27
The [NSString stringWithFormat:@"%@/%@/%@", three, two, one];Teknik tampaknya yang paling elegan. Itu harus menjadi jawaban yang dipilih.
ekillaby
1129

Sebuah pilihan:

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

Pilihan 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;
}
diciu
sumber
8
@ tablasso 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.
Rob Napier
1
Dengan string besar ini bisa menghabiskan memori. Disarankan adalah sesuatu yang 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 dari itu harus melacak daftar semua string yang mereka perlu kombinasikan.
George
Bagaimana cara 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
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.
gnasher729
150

Jika Anda memiliki 2 NSString literal , Anda juga dapat hanya 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

Nikmati.

Johannes Fahrenkrug
sumber
13
@ CristiBăluță :) Tapi ini hanya berfungsi dengan literal bukan dengan instance NSString yang dibuat secara dinamis.
Johannes Fahrenkrug
9
Anda sebenarnya tidak perlu huruf @s pada string setelah yang pertama. @"I" " really" " enjoy"...
Kevin
Anda mungkin ingin meletakkan STRINGA dan STRINGB dalam tanda kurung, jika tidak, Anda mungkin mendapatkan hasil aneh ketika makro diselesaikan. #define BERGABUNG (STRINGA STRINGB)
doo digit
@JohannesFahrenkrug Lalu mengapa ini NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";tidak berhasil? Saya mengalami Expected '@' in programkesalahan :(
Vagif
@Vagif bagaimana TABLE_NAMEdidefinisikan?
Johannes Fahrenkrug
75

Saya selalu kembali ke posting ini dan selalu memilah-milah jawaban untuk menemukan solusi sederhana ini yang bekerja dengan banyak variabel yang diperlukan:

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

Sebagai contoh:

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

Buat metode:

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

Kemudian, dalam fungsi apa pun yang Anda perlukan, atur string atau bidang teks Anda atau apa pun ke nilai balik fungsi ini.

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

Sidd Menon
sumber
Ini adalah solusi paling sederhana.
GeneCode
44

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

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

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

Untuk ukuran yang baik, saya juga menambahkan concat:argumen variabel yang mengambil nildaftar 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);
}
Palimondo
sumber
20
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.
FreeAsInBeer
2
Penanya asli 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.
sudo
32

Gunakan stringByAppendingString: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."];
Taimur Ajmal
sumber
34
Anda benar-benar menyadari bahwa Anda menyarankan hal yang persis tidak ingin ia lakukan, bukan?
SilverSideDown
begitu banyak kebocoran!
RamGrg
30

Makro:

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

Kasus uji:

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

Makro alternatif: (jika Anda ingin menerapkan jumlah minimum argumen)

// 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:@""];
EthanB
sumber
2
Belum memeriksa pertanyaan ini sebentar, tetapi saya cenderung menerima ini sebagai jawaban yang tepat setelah bertahun-tahun!
typeoneerror
1
Ini juga bisa dibilang memiliki perilaku yang lebih baik daripada -[NSString stringByAppendingString:]kasus penggunaan ini - dengan yang pertama Anda akan mendapatkan pengecualian jika argumennya niltetapi tidak jika penerima. Jadi kemungkinan 50% kemungkinan kesalahan pada pengumpan string Anda gagal diam-diam dan 50% pengecualian. Dengan stringConcatAnda dijamin pengecualian pada apa pun nil, di mana pun dalam daftar. Yang setidaknya lebih mudah diprediksi.
Tommy
27

Ketika membangun permintaan untuk layanan web, saya menemukan melakukan sesuatu seperti 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>"
};
FreeAsInBeer
sumber
Untuk obyektif-c, bisakah Anda menjelaskan apa yang dilakukan sintaks ini? Apakah ini menciptakan array string dan bergabung dengannya entah bagaimana? Referensi ke dokumen apa pun juga akan keren.
Norman H
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".
FreeAsInBeer
27

Pintasan dengan membuat makro AppendString (AS) ...

#define AS (A, B) [(A) stringByAppendingString: (B)]
NSString * myString = @ "Ini"; NSString * test = AS (myString, @ "hanyalah sebuah tes");

catatan:

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

Etarion
sumber
Keren! Saya masih berpikir Util di atas adalah solusi yang jauh lebih elegan; Anda hanya dapat menambahkan satu string dengan makro ini, bukan?
typeoneerror
1
Benar, makro AS di atas tidak menambahkan satu per baris kode. Jika beberapa penambahan merupakan 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>
2
Atau, cukup perpendek pengetikan yang diperlukan dengan makro seperti "#define AS stringByAppendingString", lalu gunakan "AS" di mana Anda biasanya mengetik "stringByAppendingString", dan nikmati beberapa penambahan per baris kode.
15
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 saat), tetapi tujuannya harus tetap keterbacaan daripada hanya singkatnya. Anda menulis sekali, tetapi Anda men-debug selamanya.
Rob Napier
Hai Rob - Saya tidak setuju dengan Anda dalam hal ini. Tentu, "AS" adalah nama yang buruk. Itu harus dinamai mungkin "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];
coder284
sumber
11

Berikut cara sederhana, menggunakan sintaks literal array baru:

NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                  ^^^^^^^ create array ^^^^^
                                               ^^^^^^^ concatenate ^^^^^
justin
sumber
9
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];

Setelah beberapa tahun sekarang dengan Objective CI 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 otomatis terisi menjadi "NSString". masukkan "str" ​​dan lengkapi otomatis ke "stringByAppendingString". Jadi penekanan tombol sangat terbatas.

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

Ian Clay
sumber
Anda benar-benar menyadari bahwa Anda menyarankan hal yang persis tidak ingin ia lakukan, bukan?
Pengguna yang bukan pengguna
8

Satu-satunya cara untuk membuat c = [a stringByAppendingString: b]lebih pendek adalah menggunakan autocomplete di sekitar sttitik. The +operator adalah bagian dari C, yang tidak tahu tentang Objective-C benda.


sumber
Anda benar-benar menyadari bahwa Anda menyarankan hal yang persis tidak ingin ia lakukan, bukan? Paling tidak, a #definedapat digunakan untuk mempersingkatnya.
Pengguna yang bukan pengguna
8

Bagaimana dengan memperpendek stringByAppendingStringdan menggunakan #define :

#define and stringByAppendingString

Dengan demikian Anda akan menggunakan:

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

Masalahnya adalah ini hanya berfungsi untuk dua string, Anda harus membungkus tanda kurung tambahan untuk tambahan lainnya:

NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
Sunday Ironfoot
sumber
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.
Volomike
8
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
Gobi M
sumber
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];
aleemb
sumber
6

Saya mencoba kode ini. ini bekerja untuk saya.

NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];
Erhan Demirci
sumber
2
Ini adalah penyalahgunaan terburuk dari NSMutableString yang pernah ada. Inti dari NSMutableString adalah bahwa Anda tidak perlu metode membuat string autoreleased tetapi dapat memodifikasi string itu sendiri.
gnasher729
Setuju. Setidaknya gunakan appendString:jika Anda menggunakan NSMutableString.
Pengguna yang bukan pengguna
6

Sedang mencoba yang berikut di lldbpanel

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

kesalahan mana.

alih-alih gunakan alokasi dan initWithFormatmetode:

[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
Anthony De Souza
sumber
1
... berharap aku punya cukup reputasi untuk berkomentar tapi harap ini membantu orang lain.
Anthony De Souza
4

Ini untuk logging yang lebih baik, dan logging 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 argumen var dengan "nil" tapi saya kira tidak ada jalan lain dalam 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 pada NSString dan menambahkan metode concatenate (+) 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.

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

Coba stringWithFormat:

NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
CommanderHK
sumber
Mengapa ini memiliki 2 downvotes? Apakah karena ini sudah disebutkan dalam jawaban lain?
Reimius
3

Ketika berhadapan dengan string sering saya merasa lebih mudah untuk membuat file sumber ObjC ++, maka saya dapat menggabungkan string std :: 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()];
iforce2d
sumber
3

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 definisi singkat untuk NSArray , saya pikir ini adalah metode tercepat untuk menggabungkan string.

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

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

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

kamu bisa menggunakan

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

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", bukan "dan".

Volomike
sumber
bagaimana cara membuatnya? misalnya: sTest3 = sTest1 + sTest2;
@ user285594 Itulah inti pertanyaannya: sintaks tidak diizinkan di Objective-C. Lihat jawaban lainnya.
Pengguna yang bukan pengguna
1

Untuk semua pecinta Objective C yang membutuhkan ini dalam 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];
}
netshark1000
sumber
0
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];
pengguna4951
sumber
0

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:@", "];
Resty
sumber