„NSStrings“ integravimo etiketės „Objective-C“

Ar Objekto-C eilutėje yra sutrumpinimų ( stringByAppendingString: arba bendrai dirbant su NSString ?

Pavyzdžiui, norėčiau padaryti:

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

kažkas daugiau:

 string myString = "This"; string test = myString + " is just a test"; 
1066
04 февр. nustatyti typeoneerror 04 vasaris 2009-02-04 09:26 '09 9:26 am. 2009-02-04 09:26
@ 30 atsakymų

Du atsakymai, kuriuos galiu galvoti ... nėra ypač malonūs, kaip ir sujungimo operatorius.

Pirmiausia naudokite „ NSMutableString , kuri turi „ appendString metodą, pašalindama dalį papildomų laikinų styginių.

Antra, naudokite NSArray kad galėtumėte NSArray naudojant componentsJoinedByString metodą.

587
04 февр. Chris Blackwell atsakymas 04 Feb. 2009-02-04 09:44 '09, 9:44 val. 2009-02-04 09:44

Pasirinkimas:

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

Kita parinktis:

Manau, kad esate nepatenkintas keliais papildymais (a + b + c + d), tokiu atveju galėtumėte padaryti:

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

naudojant kažką panašaus

 + (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 февр. atsakymas diciu 04 vasaris 2009-02-04 10:53 '09, 10:53 AM 2009-02-04 10:53

Jei turite 2 „NSString“ literatūrą , taip pat galite tai padaryti:

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

Tai taip pat naudinga jungiant #defines:

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

Mėgaukitės

142
17 марта '11 в 14:59 2011-03-17 14:59 atsakymą pateikė Johannes Fahrenkrug kovo 17 d. 11 val. 14.59 2011-03-17 14:59

Toliau grįšiu į šį pranešimą ir visada baigiu surūšiuoti atsakymus, kad surastumėte šį paprastą sprendimą, kuris dirba su tiek, kiek reikia,

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

Pavyzdžiui:

 NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId]; 
68
11 авг. atsakymas, kurį pateikė Kyle Clegg 11 rug. 2012-08-11 09:51 '12 at 9:51 am 2012-08-11 09:51

Na, kadangi dvitaškis yra specialus simbolis, tačiau yra metodo parašo dalis, galite pasirinkti NSString kategoriją, kad pridėtumėte šį ne idiomatinį styginių susiejimo stilių:

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

Jūs galite apibrėžti tiek daug argumentų, atskirtų dvitaškiais, kaip naudinga ...; -)

Gera priemonė, aš taip pat pridūrė, concat: su kintamais argumentais, kad nil užpildyti styginių sąrašą.

 // 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 atsakymą Palimondo pateikė kovo 16 d. 12 val. 2012-03-17 03:41

Sukurti metodą:

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

Tada bet kokioje funkcijoje, kurią jums reikia, nustatykite savo eilutės ar teksto lauką arba kažką kitą už šios funkcijos grąžinimo vertę.

Arba, jei norite sukurti nuorodą, konvertuokite NSString į C ++ eilutę ir naudokite „+“.

36
04 окт. atsakymą pateikė Sidd Menon 04 okt. 2011-10-04 01:29 '11 ne 1:29 2011-10-04 01:29

Naudokite šį metodą:

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

Or

 result = [result stringByAppendingString:@"This is "]; result = [result stringByAppendingString:@"my string."]; 
32
26 июля '10 в 19:04 2010-07-26 19:04 atsakymą pateikė Taimur Ajmal , liepos 26 d., 10, 19:04 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:@""] 

Bandymo atvejai:

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

Alternatyvus makro: (jei norite pateikti minimalų argumentų skaičių)

 // 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 atsakymą įteikė EthanB gegužės 31 d. 13 val. 20:07 2013-05-31 20:07

Kuriant užklausas dėl žiniatinklio paslaugų, manau, kad kažką panašaus padaryti yra labai paprasta ir XCode kodavimas yra įskaitomas:

 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 atsakymas suteiktas „ FreeAsInBeer“ kovo 16 d., 17:24, 2012-03-16 17:24

Etiketė, sukurianti makrokomandą „AddString“ (AS)

 #define AS (A, B) [(A) stringByAppendingString: (B)] 
NSString * myString = @ "Tai"; NSString * test = AS (myString, @ "yra tik testas");

Pastaba:

Jei naudojate makrokomandą, tai tiesiog atlikite su kintamais argumentais, žr. EthanB Response.

25
18 июля '09 в 8:38 2009-07-18 08:38 atsakymą pateikė Jim Logan liepos 18 d., 08:38, 2009-07-18 08:38
 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 atsakymas duotas koduotojui284 birželio 10 d. 12:50 2010-06-10 12:50

Štai paprastas būdas naudojant naują masyvo sintaksę:

 NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""]; ^^^^^^^ create array ^^^^^ ^^^^^^^ concatenate ^^^^^ 
10
30 авг. atsakymas pateikiamas tik 30 rug. 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"]; 

Po poros metų C tikslo manau, kad tai yra geriausias būdas dirbti su C tikslu, kad pasiektumėte tai, ką bandote pasiekti.

Pradėkite rašyti „N“ „Xcode“ programoje ir automatiškai paleiskite „NSString“. raktas yra „str“, ir jis automatiškai užpildomas „stringByAppendingString“. Taigi, klavišų paspaudimai yra gana riboti.

Kai gausite „@“ klavišą ir rašysite nuskaitomo kodo rašymo procesą, nebebus problema. Tai tik prisitaikymo klausimas.

9
01 авг. Ian Clay atsakymas 01 rug. 2013-08-01 16:13 '13, 16:13 2013-08-01 16:13
 NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"]; 
8
29 апр. atsakymą pateikė Gobi M balandžio 29 d. 2013-04-29 10:35 '13, 10:35, 2013-04-29 10:35

Vienintelis būdas padaryti c = [a stringByAppendingString: b] trumpesnis - naudokite automatinį užbaigimą st . + Operatorius yra C dalis, kuri nežino objekto C objektų.

8
04 февр. atsakymas suteiktas user23743 04 Feb. 2009-02-04 10:25 '09, 10:25 2009-02-04 10:25

Ką apie santrumpą stringByAppendingString ir naudokite stringByAppendingString :

 #define and stringByAppendingString 

Taigi jūs naudosite:

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

Problema yra ta, kad ji veikia tik dviem eilutėmis, todėl reikia pridėti papildomų skliaustų, kad pridėtumėte:

 NSString* myString = [[@"Hello" and: @" world"] and: @" again"]; 
8
04 июля '12 в 1:36 2012-07-04 01:36 atsakymas į sekmadienį Ironfoot pateikiamas liepos 4 d. 12 d. 1:36 2012-07-04 01:36
 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
atsakymas 2009-06-20 20:38 Birželio 20 d., 20:38, 2009-06-20 20:38

lldb skydelyje bandė atlikti šiuos lldb

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

kokios klaidos.

vietoj to naudokite paskirstymo ir initWithFormat :

 [[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"]; 
6
07 апр. Anthony De Souza atsakymas 07 Bal 2014-04-07 14:45 '14, 14:45, 2014-04-07 14:45

Bandžiau šį kodą. jis dirbo man.

 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 atsakymą pateikė Erhanas Demirci gegužės 13 d., 19:38, 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 янв. Avinash Mishra atsakė į 20 Jan 2016-01-20 16:42 '16, 16:42 pm 2016-01-20 16:42

Tai skirta geresniam registravimui ir tik registravimui - remiantis puikiu dicius argumento metodu. Apibrėžiu Logger klasę ir vadinu tai:

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

Beveik gerai, išskyrus tai, kad jums reikia užbaigti var args "nil", bet manau, kad C tikslas nėra.

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 

Tik „ concat“ eilutėse NSString kategorijoje nustatau kategoriją ir į ją įtraukiu statišką (+) susietą metodą, kuris atrodo lygiai taip pat, kaip aukščiau aprašytas žurnalo metodas, išskyrus tai, kad jis grąžina eilutę. Tai yra „NSString“, nes tai yra eilutės metodas, ir jis yra statinis, nes norite sukurti naują eilutę iš 1-N eilutės, o ne ją pavadinti nė viena iš priedėlio dalių.

4
23 марта '11 в 20:37 2011-03-23 20:37 atsakymas pateikiamas Nr. 13 kovo 23 d., „11, 20:37 2011-03-23 ​​20:37

Išbandykite eilutęWithFormat:

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

Dirbant su stygomis, man dažnai lengviau padaryti šaltinio failą ObjС ++, tada galiu sujungti std :: stringas naudodamas antrąjį metodą, parodytą klausime.

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

Mano pageidaujamas metodas:

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

Tai galite pasiekti pridedant prisijungimo metodą prie NSArray su kategorija:

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

@[] yra trumpas „ NSArray apibrėžimas, manau, kad tai greičiausias būdas susieti eilutes.

Jei nenorite naudoti kategorijos, tiesiogiai naudokite componentsJoinedByString: metodą ::

 NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""]; 
3
03 мая '13 в 19:40 2013-05-03 19:40 atsakymas duotas LombaX 03 gegužės 13 d. 19:40 2013-05-03 19:40

Galite naudoti NSArray as

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

arba

galite naudoti

 NSString *imageFullName=[NSString stringWithFormat:@"%@ %@ %@.", string1,string2,string3]; 
3
05 апр. atsakymas pateikiamas Arun 05 balandžio. 2013-04-05 08:38 '13, 8:38, 2013-04-05 08:38

Bet kuris iš šių formatų veikia XCode7, kai bandau:

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

Dėl kokios nors priežasties jums reikia tik @ simbolio pirmoje mišinio eilutėje.

Tačiau jis neveikia su kintamųjų įterpimu. Norėdami tai padaryti, galite naudoti šį labai paprastą sprendimą , išskyrus makro „katė“ naudojimą vietoj „ir“.

1
28 янв. Atsakyti Volomike 28 Jan 2016-01-28 23:36 '16 at 11:36 pm 2016-01-28 23:36

Visiems objektyvo C mėgėjams, kuriems reikia UI testo:

 -(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 atsakymas pateikiamas netshark1000 birželio 07, 16 d. 11:45 2016-06-07 11:45

Tarkime, u nežino, kiek linijų yra.

 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 atsakymas pateikiamas „ Resty“ gegužės 16, 16 d., 11:08
 listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""]; 
0
22 янв. atsakymą pateikė user4951 22 sausis 2013-01-22 07:10 '13, 7:10, 2013-01-22 07:10

Greitai

 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" 

Be to, galite naudoti += operatorių tokiam pat kaip ir žemiau ...

 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 atsakymas duotas Suryakant kovo 03 '16, 11:42 2016-03-03 11:42

Kiti klausimai apie etikečių arba užduoti klausimą