NSStrings Integration üçün Objective-C-də etiketlər

stringByAppendingString: NSString ilə işləmək üçün Objective-C-də string concatenation ( stringByAppendingString: və ya qısa yollar üçün qısa yollar varmı?

Məsələn, bunu etmək istərdim:

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

daha çox şey:

 string myString = "This"; string test = myString + " is just a test"; 
1066
04 февр. set typeoneerror 04 Feb 2009-02-04 09:26 '09 saat 09:26 'da 2009-02-04 09:26
@ 30 cavab

Birincisi, birləşmə operatoru kimi, mən düşünə biləcəyim iki cavab ... xüsusilə xoş deyil.

appendString strings ehtiyacının bir hissəsini aradan qaldırılması appendString metodu olan ilk istifadə NSMutableString .

İkincisi, NSArray componentsJoinedByString üsulu ilə birləşmə üçün istifadə edin.

587
04 февр. Chris Blackwell tərəfindən verilmiş cavab 04 fevral. 2009-02-04 09:44 '09 at 09:44 AM 2009-02-04 09:44

Seçim:

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

Digər seçim:

Hesab edirəm ki, siz bir neçə əlavəyə (a + b + c + d) bədbəxt olmursunuz, buna görə də edə bilərsiniz:

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

kimi bir şey istifadə

 + (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; } 
1081
04 февр. cavab verildi diciu 04 fevral. 2009-02-04 10:53 '09 at 10:53 AM 2009-02-04 10:53

2 NSString yazımınız varsa , bunu da edə bilərsiniz:

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

Bu da #defines birləşdirmək üçün faydalıdır:

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

Enjoy

142
17 марта '11 в 14:59 2011-03-17 14:59 Cavab Johannes Fahrenkrug tərəfindən 17 Mart 17: 11 'də verildi . 14:59 2011-03-17 14:59

Mən bu yazıya geri qayıdacağıq və lazım olan qədər çox dəyişənlərlə işləyən bu sadə həll tapmaq üçün cavabları sıralayıram:

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

Məsələn:

 NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId]; 
68
11 авг. Kyle Clegg tərəfindən verilmiş cavab 11 avqust. 2012-08-11 09:51 '12 saat 09:51 'da 2012-08-11 09:51

Əlbəttə ki, kolon xüsusi bir xarakter daşıyır, amma metod imzasının bir hissəsidir, bu qeyri - idiomatik string concatenation stilini əlavə etmək üçün NSString kateqoriyasını seçə bilərsiniz:

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

Faydalı tapdığınız kimi, birləşmələrlə ayrılmış bir çox dəlil kimi müəyyən edə bilərsiniz ...; -)

Yaxşı bir tədbir üçün mən də əlavə etdim concat: dəyişən dəlilləri ilə strings siyahısını tamamlamaq üçün 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); } 
43
16 марта '12 в 3:41 2012-03-16 03:41 Cavab Palimondo tərəfindən 16 mart '12 saat 03:41 'də verilir 2012-03-16 03:41

Bir üsul yaradın:

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

Sonra, lazım olan hər hansı bir funksiyada, bu funksiyanı qaytarma dəyəri üçün simli və ya mətn sahəsini və ya başqa bir şeyi təyin edin.

Ya da, bir kısayol yaratmaq üçün NSString'i C ++ dizgesine çevir ve orada "+" istifadə edin.

36
04 окт. Cavab Sidd Menon 04 oct tərəfindən verilir . 2011-10-04 01:29 '11 at 1:29 2011-10-04 01:29

Bu üsuldan istifadə edin:

 NSString *string1, *string2, *result; string1 = @"This is "; string2 = @"my string."; result = [result stringByAppendingString:string1]; result = [result stringByAppendingString:string2]; 

Və ya

 result = [result stringByAppendingString:@"This is "]; result = [result stringByAppendingString:@"my string."]; 
32
26 июля '10 в 19:04 2010-07-26 19:04 Cavab Taimur Ajmal tərəfindən 26 iyul 'da saat 19: 00-da verilir. 2010-07-26 19:04

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

Test halları:

 - (void)testStringConcat { NSString *actual; actual = stringConcat(); //might not make sense, but it 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"); } 

Alternativ makro: (minimum arqumentlərin sayını təmin etmək istəyirsinizsə)

 // 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
31 мая '13 в 20:07 2013-05-31 20:07 cavab 31 may 2013-cü il saat 20:07 'da EthanB tərəfindən verilir

Web xidmətlərindən istifadələr yaratdıqda, aşağıdakı kimi bir şey etmək çox sadədir və Xcode-də birləşmə oxunaqlı edir:

 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
16 марта '12 в 17:24 2012-03-16 17:24 Cavab FreeAsInBeer 16 mart 2012-ci il saat 17: 00 -da verilir

Etiket yaratmaq makro AppendString (AS) ...

 #define AS (A, B) [(A) stringByAppendingString: (B)] 
NSString * myString = @ "Bu"; NSString * test = AS (myString, @ "yalnız bir testdir");

Qeyd:

Bir makro istifadə etsəniz, əlbəttə ki, yalnız dəyişən arqumentlərlə bunu etin, bax EthanB Response.

25
18 июля '09 в 8:38 2009-07-18 08:38 Cavab Jim Logan tərəfindən 18 iyul 18: 08-də verilir
 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
10 июня '10 в 12:50 2010-06-10 12:50 Cavab coder284 10 iyun 'da saat 12:50' də verildi. 2010-06-10 12:50

Yeni bir dizinin literal sintaksisini istifadə edərək, sadə bir yol:

 NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""]; ^^^^^^^ create array ^^^^^ ^^^^^^^ concatenate ^^^^^ 
10
30 авг. Cavab yalnız 30 avqust verilir . 2012-08-30 05:29 '12 at 5:29 2012-08-30 05:29
 NSString *myString = @"This"; NSString *test = [myString stringByAppendingString:@" is just a test"]; 

C Objective C ilə bir neçə il sonra, inanıram ki, bu məqsədə nail olmaq üçün çalışırıq ki, məqsədi C ilə işləmək üçün ən yaxşı yoldur.

Xcode tətbiqində "N" yazaraq başlayın və avtomatik olaraq "NSString" işləyin. əsas "str" ​​və "stringByAppendingString" ilə avtomatik doldurulur. Beləliklə, tuş vuruşları olduqca məhduddur.

"@" Düyməsini asmaq və okunabilir kod yazma prosesini yazdıqdan sonra problem artıq olmayacaq. Yalnız uyğunlaşma məsələsidir.

9
01 авг. Cavab Ian Clay 01 avqustda verilir. 2013-08-01 16:13 '13 'da 16:13' da 2013-08-01 16:13
 NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"]; 
8
29 апр. Cavab 29 oktyabrda Gobi M tərəfindən verilir . 2013-04-29 10:35 '13 saat 10:35 'da 2013-04-29 10:35

c = [a stringByAppendingString: b] etmək üçün yeganə yol - nöqtədə avtomatik tamamlama istifadə edin. + Operatoru Objective-C obyektləri haqqında bilməyən C hissəsidir.

8
04 февр. Cavab verilir İstifadəçi 23743 04 fevral. 2009-02-04 10:25 '09 at 10:25 'da 2009-02-04 10:25

stringByAppendingString kısaltma və stringByAppendingString istifadə edin:

 #define and stringByAppendingString 

Belə ki, istifadə edəcəyiniz:

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

Problem yalnız iki xətt üçün işlədilməsidir, əlavə etmək üçün əlavə qoşmalar əlavə etmək lazımdır:

 NSString* myString = [[@"Hello" and: @" world"] and: @" again"]; 
8
04 июля '12 в 1:36 2012-07-04 01:36 cavab iyul ayının 4-də saat 04: 00-da saat 01: 36-da verilir
 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
cavab verildi 2009-06-20 20:38 20 iyun 'da 20:38' da, 2009-06-20 20:38 'də

lldb panelində aşağıdakıları lldb

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

nə səhvlər.

əvəzinə, alloc və initWithFormat istifadə edin:

 [[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"]; 
6
07 апр. Anthony De Souza tərəfindən verilmiş cavab 07 Apr 2014-04-07 14:45 '14 saat 14:45 'də 2014-04-07 14:45

Bu kodu sınadım. mənim üçün çalışdı.

 NSMutableString * myString=[[NSMutableString alloc]init]; myString=[myString stringByAppendingString:@"first value"]; myString=[myString stringByAppendingString:@"second string"]; 
6
11 мая '13 в 19:38 2013-05-11 19:38 Cavab Erhan Demirci tərəfindən 11 May 'da 19:38' da veriləcək 2013-05-11 19:38
 NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude]; NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude]; NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon]; 
4
20 янв. Avinaş Mişra 20 Yanvar cavablandırdı 2016-01-20 16:42 '16 saat 04:42 'da 2016-01-20 16:42

Bu daha yaxşı giriş üçün və yalnız giriş üçün - dicius əla arqument metoduna əsaslanır. Logger sinifini təsvir edirəm və bu kimi deyirəm:

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

Demək olar ki, yaxşı, args "nil" bitirmək üçün istisna olmaqla, amma obyektiv-C heç bir yol yoxdur deməkdir.

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 

Yalnız concat strings üçün NSString kateqoriyasını müəyyənləşdirir və statik (+) birləşmə metodunu yuxarıdakı log üsuluna bənzəyən bir simli qaytarır istisna olmaqla əlavə edir. Bu, NSString üzərindədir, çünki bu simli metoddur və statikdir, çünki 1-N stringsindən yeni bir simli yaratmaq və əlavə etmək üçün bir hissəsi olan strinqlərdən birini çağırmaq deyil.

4
23 марта '11 в 20:37 2011-03-23 20:37 Cavab verilib13 mart 23, '11 saat 20:37 'də 2011-03-23 ​​20:37

StringWithFormat:

 NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42]; 
3
11 нояб. Cavab CommanderHK 11 noyabrda verilir . 2012-11-11 21:28 '12 at 21:28 2012-11-11 21:28

Dizələrlə işləyərkən, mənim üçün mənbə faylını ObjС + + 'yı daha asanlaşdırsın, sonra sualda göstərilən ikinci üsulla std :: strings birləşdirə bilərəm.

 std::string stdstr = [nsstr UTF8String]; //easier to read and more portable string manipulation goes here... NSString* nsstr = [NSString stringWithUTF8String:stdstr.c_str()]; 
3
14 нояб. Cavab iforce2d 14 noyabrda verilir . 2012-11-14 16:41 '12 at 4:41 pm 2012-11-14 16:41

Tercih etdiyim üsul:

 NSString *firstString = @"foo"; NSString *secondString = @"bar"; NSString *thirdString = @"baz"; NSString *joinedString = [@[firstString, secondString, thirdString] join]; 

Bir NSArray bir kateqoriya ilə birləşmə üsulu əlavə edərək bunu əldə edə bilərsiniz:

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

@[] NSArray üçün qısa bir NSArray , məncə bu simləri birləşdirmək üçün ən sürətli yoldur.

Bir kateqoriya istifadə etmək istəmirsinizsə, birbaşa componentsJoinedByString: üsulunu istifadə edin:

 NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""]; 
3
03 мая '13 в 19:40 2013-05-03 19:40 Cavab LombaX 03 May '13 saat 19:40 'da verilir 2013-05-03 19:40

Siz NSArray kimi istifadə edə bilərsiniz

 NSString *string1=@"This" NSString *string2=@"is just" NSString *string3=@"a test" NSArray *myStrings = [[NSArray alloc] initWithObjects:string1, string2, string3,nil]; NSString *fullLengthString = [myStrings componentsJoinedByString:@" "]; 

və ya

istifadə edə bilərsiniz

 NSString *imageFullName=[NSString stringWithFormat:@"%@ %@ %@.", string1,string2,string3]; 
3
05 апр. cavab Arun 05 apr verilir . 2013-04-05 08:38 '13 'da 8:38' də 2013-04-05 08:38

Test etdiyim zaman bu formatlardan hər hansı biri XCode7-də işləyir:

 NSString *sTest1 = {@"This" " and that" " and one more"}; NSString *sTest2 = { @"This" " and that" " and one more" }; NSLog(@"\n%@\n\n%@",sTest1,sTest2); 

Bəzi səbəblərə görə, mixin birinci xəttində @ simvoluna ehtiyacınız var.

Lakin, dəyişənlərin yerləşdirilməsi ilə işləmir. Bunun üçün "və" yerinə makro "pişik" istifadə etmək istisna olmaqla, bu son dərəcə sadə həlli istifadə edə bilərsiniz.

1
28 янв. Cavab Volomike 28 Yanvar 2016-01-28 23:36 '16 saat 11:36 'də 2016-01-28 23:36

Bir UI testində ehtiyacı olan bütün Obyektiv-C sevgililəri üçün:

 -(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
07 июня '16 в 11:45 2016-06-07 11:45 cavab netshark1000 07 İyun, '16 'saat 11:45' də verilir 2016-06-07 11:45

Neçə xəttin olduğunu bilmirəm.

 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
27 мая '16 в 11:08 2016-05-27 11:08 cavab 27 may, '16 'saat 11:08' də verilir. 2016-05-27 11:08
 listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""]; 
0
22 янв. cavab user4951 22 yanvar tərəfindən verilir 2013-01-22 07:10 '13 at 07:10 2013-01-22 07:10

Tezliklə

 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" 

Bundan əlavə, aşağıda göstərilənlər üçün += operatoru istifadə edə bilərsiniz ...

 var str3 = "Some String" str3 += str2 // str3 would be "Some String is just a test" 
-1
03 марта '16 в 11:42 2016-03-03 11:42 Cavab Suryakant'a 03 Mart 'da 11:42' də verilir 2016-03-03 11:42