Verknüpfungen in Objective-C zum Verketten von NSStrings

1129

Gibt es Verknüpfungen zur stringByAppendingString:Verkettung von ( ) Zeichenfolgen in Objective-C oder Verknüpfungen zum Arbeiten mitNSString allgemeine ?

Zum Beispiel möchte ich machen:

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

so etwas wie:

string myString = "This";
string test = myString + " is just a test";
typoneerror
quelle
4
Ich möchte nur '@ +' als Verkettungsoperator vorschlagen. Ich erwarte dies im nächsten Update von Objective-C, kthxbai
powerj1984
44
@NicolasMiari Dies ist nicht die einzige Funktion, die Objective-C fehlt. Es gibt Dutzende von anderen. Zitat aus dem Link, den Jordão gepostet hat: "Objective-C ist, um ehrlich zu sein, eine primitive Sprache. Vergleichen Sie sie mit jeder modernen Sprache, und Sie werden schnell feststellen, dass sie fehlt." Genau. Objective-C (Anfang der 1980er Jahre) ist C (Anfang der 1970er Jahre) mit der Hinzufügung einer sehr einfachen und nicht sehr typsicheren Art von OOP. Es ist in Ordnung, aber im Vergleich zu Java oder C # fühlt es sich sehr altmodisch an.
Jcsahnwaldt sagt GoFundMonica
5
@NicolasMiari: Interpretierte Sprache? C # und Java sind kompilierte Sprachen. Kompiliert zu Bytecode, der dann erneut zu Maschinencode kompiliert wird.
Joren
3
Die Dinge ändern sich jetzt: Swift (Apple neue Sprache) ist einfacher
Pradeep
6
In Bezug auf "Typensicherheit" denke ich, dass es ein Stilproblem ist. Für jemanden, der aus C # / C ++ kommt, mag es seltsam erscheinen, heterogene Arrays von Objekten jeglicher Art zu haben, aber für jemanden, der an Objective-C / Cocoa gewöhnt ist, ist dies eine Form von Dynamik und Freiheit. Dies ist von Vorteil, sofern Sie wissen, was Sie tun. Wie so ziemlich alles an C, was jüngere Programmierer heutzutage
verprügeln

Antworten:

616

Zwei Antworten, die ich mir vorstellen kann ... keine ist besonders angenehm, als nur einen Verkettungsoperator zu haben.

Verwenden Sie zuerst eine NSMutableString, die eine hatappendString Methode, die zum Teil die Notwendigkeit für zusätzliche temporäre Strings zu entfernen.

Zweitens verwenden Sie eine, NSArrayum über die componentsJoinedByStringMethode zu verketten .

Chris Blackwell
quelle
34
Obwohl die andere Option viele positive Stimmen hat, denke ich, dass dies die beste Antwort ist, wenn Sie nicht alle Ihre Saiten beim Bau kennen. Jedes Mal, wenn Sie eine Zeichenfolge anhängen, entsteht ein hoher Overhead. Die Verwendung einer veränderlichen Zeichenfolge behebt dieses Problem.
Eli
22
+1 stimme w @Eli zu. Dies sind im Allgemeinen die besten Lösungen. NSArray -componentsJoinedByString kann ziemlich gut in einer einzelnen Zeile ausgeführt werden: string = [[NSArray arrayWithObjects: @ "This", "Is", "A", "Test", nil] componentsJoinedByString: @ ""];
Rob Napier
4
+1 für diese Antwort. [NSMutableString appendString]ist speicherfreundlicher als [NSString stringByAppendingStrings].
Pierre-David Belanger
2
@RobNapier: Mit der neuen Array-Literal-Syntax ist es jetzt noch besser.
Amogh Talpallikar
27
Die [NSString stringWithFormat:@"%@/%@/%@", three, two, one];Technik scheint die eleganteste. Es sollte die ausgewählte Antwort sein.
Ekillaby
1129

Eine Option:

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

Andere Option:

Ich vermute, Sie sind mit mehreren Anhängen (a + b + c + d) nicht zufrieden. In diesem Fall könnten Sie Folgendes tun:

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

mit so etwas wie

+ (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
quelle
8
@pablasso Einverstanden. Die Util-Methode ist ziemlich hässlich. Wenn Sie so etwas wollten, sollte es als NSString-Kategorie mit einem Namen wie + stringByAppendingStrings: erstellt werden. Sogar eine direkte Funktion mit einem Namen wie NSStringForAppendedStrings (...) wäre besser als eine statische Methode in einer Klasse wie Util (alles mit "Util" im Namen wird wahrscheinlich schlecht berücksichtigt). Die Funktion wird auch besser mit einem NSMutableString und -appendString implementiert, um zu vermeiden, dass ein unbegrenzter Satz temporärer autorelease NSStrings erstellt wird.
Rob Napier
1
Bei großen Zeichenfolgen kann dies Speicherplatz verschwenden. Empfohlen wird eher StringBuilder in echten Programmiersprachen. Dann können Sie einfach herausfinden, wie viel Speicher benötigt wird, bevor Sie mit dem Anhängen beginnen. Der obige Ansatz könnte dazu überarbeitet werden. Es ist jedoch besser, ein StringBuilder-Objekt zu erstellen, da dies den Benutzer davon abhält, eine Liste aller Zeichenfolgen zu verfolgen, die sie zusammen benötigen.
George
Wie importiere ich Util? Diese IDE ist frustrierend (kein Vorschlag "importiere etwas. Bis" wie bei Eclipse, und ich finde keine Erwähnung von "Util" irgendwo. Ist dies eine Klasse, die ich selbst
codieren
stringWithFormat ist nicht nur sehr elegant, sondern auch viel leistungsfähiger. Sie verwenden es mit @ "% @% @", um zwei Zeichenfolgen zu verketten, @ "% @% @% @", um drei Zeichenfolgen zu verketten. Sie können jedoch zusätzliche Zeichen einfügen, Zahlen drucken, Parameter neu anordnen, wenn Sie möchten, und so weiter . Die Formatzeichenfolge kann lokalisiert werden, wodurch sie zehnmal leistungsfähiger wird. Die Verkettung von Zeichenfolgen ist für Anfänger gedacht.
Gnasher729
150

Wenn Sie 2 NSString- Literale haben , können Sie dies auch einfach tun:

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

Dies ist auch nützlich, um #defines beizutreten:

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

Genießen.

Johannes Fahrenkrug
quelle
13
@ CristiBăluță :) Dies funktioniert jedoch nur mit Literalen, nicht mit dynamisch erstellten NSString-Instanzen.
Johannes Fahrenkrug
9
Sie brauchen eigentlich nicht das @s auf den Saiten nach dem ersten. @"I" " really" " enjoy"...
Kevin
Sie sollten wahrscheinlich STRINGA und STRINGB in Klammern setzen wollen, da Sie sonst möglicherweise seltsame Ergebnisse erhalten, wenn das Makro aufgelöst wird. #define JOINED (STRINGA STRINGB)
Digory Doo
@JohannesFahrenkrug Warum NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";funktioniert das dann nicht? Ich habe einen Expected '@' in programFehler :(
Vagif
@Vagif wie ist TABLE_NAMEdefiniert?
Johannes Fahrenkrug
75

Ich kehre immer wieder zu diesem Beitrag zurück und sortiere immer die Antworten, um diese einfache Lösung zu finden, die mit so vielen Variablen wie nötig funktioniert:

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

Zum Beispiel:

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

Erstellen Sie eine Methode:

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

Setzen Sie dann in der Funktion, in der Sie sie benötigen, Ihre Zeichenfolge oder Ihr Textfeld oder was auch immer auf den Rückgabewert dieser Funktion.

Um eine Verknüpfung zu erstellen, konvertieren Sie den NSString in einen C ++ - String und verwenden Sie dort das '+'.

Sidd Menon
quelle
Dies ist die einfachste Lösung.
GeneCode
44

Nun, wie Kolon Art speziellen Symbol ist, sondern ist Teil der Methodensignatur, ist es möglich, die exted NSStringmit Kategorie dieses hinzufügen nicht-idiomatischen Stil der String - Verkettung:

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

Sie können so viele durch Doppelpunkte getrennte Argumente definieren, wie Sie nützlich finden ... ;-)

Für eine gute Maßnahme habe ich auch concat:variable Argumente hinzugefügt , die eine nilterminierte Liste von Zeichenfolgen verwenden.

//  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
quelle
20
Ich habe dies vor einem Jahr abgelehnt, weil es keine sehr gute Antwort ist. Um mit der Verkettung einer großen Anzahl von Zeichenfolgen fertig zu werden, erfordert die Implementierung von Palimondo entweder die Implementierung einer großen Anzahl sehr ähnlich aussehender Methoden oder das mehrfache Aufrufen der Methoden, was zu einem großen Codeabschnitt führt, der im Wesentlichen nur Zeichenfolgen verkettet. Mit diesem Ansatz erhalten Sie keinen Vorteil gegenüber einem einfachen stringWithFormat:. Ganz zu schweigen von dem Mangel an benannten Parametern, der nicht nur nicht dem Standard entspricht, sondern auch verwirrend ist.
FreeAsInBeer
2
Der ursprüngliche Fragesteller erwähnte stringByAppendingString, und er sagte nie etwas darüber, mehr als zwei Argumente zu verwenden. Diese Antwort gefällt mir besser als die akzeptierte. Es ist ziemlich klug.
Sudo
32

Verwenden Sie stringByAppendingString:diesen Weg:

NSString *string1, *string2, *result;

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

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

ODER

result = [result stringByAppendingString:@"This is "];
result = [result stringByAppendingString:@"my string."];
Taimur Ajmal
quelle
34
Sie erkennen, dass Sie genau das vorschlagen, was er nicht tun wollte, oder?
SilverSideDown
so viel Leckage!
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:@""]

Testfälle:

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

Alternatives Makro: (wenn Sie eine Mindestanzahl von Argumenten erzwingen möchten)

// 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
quelle
2
Ich habe diese Frage schon eine Weile nicht mehr geprüft, aber ich neige dazu, dies nach all den Jahren als die richtige Antwort zu akzeptieren!
Typoneerror
1
Dies hat wohl auch ein besseres Verhalten als -[NSString stringByAppendingString:]für diesen Anwendungsfall - mit dem ersteren erhalten Sie eine Ausnahme, wenn das Argument ist, nilaber nicht, wenn der Empfänger ist. Es ist also denkbar, dass die Wahrscheinlichkeit, dass ein Fehler in Ihrem Saitenvorschub lautlos ausfällt, bei 50% liegt und bei einer Ausnahme bei 50%. Mit stringConcatIhnen ist eine Ausnahme an jedem Ort nilin der Liste garantiert . Was zumindest vorhersehbarer ist.
Tommy
27

Beim Erstellen von Anforderungen für Webdienste finde ich Folgendes sehr einfach und macht die Verkettung in Xcode lesbar:

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
quelle
Können Sie für einen Objective-C-Noob erklären, was diese Syntax bewirkt? Erstellt dies eine Reihe von Zeichenfolgen und verbindet sie irgendwie? Ein Verweis auf Dokumente wäre auch cool.
Norman H
2
@NormanH: Dies ist eigentlich Teil der C-Sprache. Nach einem kleinen Graben, war ich finden kann dies . In der Phase "String-Verkettung" heißt es: Alle benachbarten String- und Wide-String-Literale werden verkettet. Beispielsweise wird "String" "Verkettung" zu "String-Verkettung".
FreeAsInBeer
27

Verknüpfung durch Erstellen eines AppendString (AS) -Makros ...

#define AS (A, B) [(A) stringByAppendingString: (B)]
NSString * myString = @ "This"; NSString * test = AS (myString, @ "ist nur ein Test");

Hinweis:

Wenn Sie ein Makro verwenden, tun Sie dies natürlich nur mit verschiedenen Argumenten, siehe EthanBs Antwort.

etarion
quelle
Cool! Ich denke immer noch, dass das Util oben eine viel elegantere Lösung ist. Sie können mit diesem Makro nur eine Zeichenfolge anhängen, oder?
Typoneerror
1
Richtig, das obige AS-Makro fügt pro Codezeile einen Anhang hinzu. Wenn mehrere Anhänge häufig benötigt werden, können weitere Makros erstellt werden. Beispiel: Ein Makro zum Anhängen von zwei Zeichenfolgen: <pre> #define A2S (A, B, C) [[(A) stringByAppendingString: (B)] stringByAppendingString: (C)] </ pre>
2
Oder verkürzen Sie einfach die erforderliche Eingabe mit einem Makro wie "#define AS stringByAppendingString", verwenden Sie dann einfach "AS", wo Sie normalerweise "stringByAppendingString" eingeben, und genießen Sie mehrere Anhänge pro Codezeile.
15
Das Problem mit diesen Makros ist, dass sie eines der Hauptziele von Objective-C untergraben, nämlich die Lesbarkeit. Es ist äußerst unklar, was "AS" tut. Das Speichern einiger Tastenanschläge (von denen die meisten mit automatischer Vervollständigung behandelt werden) auf Kosten der Lesbarkeit ist selten ein guter Kompromiss. Es gibt Ausnahmen (die @ "" -Syntax ist viel besser lesbar als jedes Mal + stringWithUTF8String:), aber das Ziel sollte immer noch die Lesbarkeit und nicht nur die Kürze sein. Sie schreiben einmal, aber Sie debuggen für immer.
Rob Napier
Hallo Rob, da kann ich dir nicht zustimmen. Sicher, "AS" ist ein schlechter Name. Es sollte vielleicht "CAT" heißen.
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
quelle
11

Hier ist eine einfache Möglichkeit, die neue Array-Literal-Syntax zu verwenden:

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

Nach ein paar Jahren mit Objective CI ist dies der beste Weg, mit Objective C zusammenzuarbeiten, um das zu erreichen, was Sie erreichen möchten.

Geben Sie in Ihrer Xcode-Anwendung "N" ein und es wird automatisch zu "NSString" vervollständigt. Geben Sie "str" ​​ein und es wird automatisch zu "stringByAppendingString" vervollständigt. Die Tastenanschläge sind also recht begrenzt.

Sobald Sie den Dreh raus haben, die Taste "@" zu drücken und den Vorgang des Schreibens von lesbarem Code zu starten, wird dies kein Problem mehr. Es ist nur eine Frage der Anpassung.

Ian Clay
quelle
Sie erkennen, dass Sie genau das vorschlagen, was er nicht tun wollte, oder?
Benutzer, der kein Benutzer ist
8

Die einzige Möglichkeit, c = [a stringByAppendingString: b]eine Verkürzung vorzunehmen, besteht darin, die automatische Vervollständigung um den stPunkt herum zu verwenden. Der +Operator ist Teil von C, das keine Kenntnisse über Objective-C-Objekte hat.


quelle
Sie erkennen, dass Sie genau das vorschlagen, was er nicht tun wollte, oder? Zumindest #definekönnte a verwendet werden, um es zu verkürzen.
Benutzer, der kein Benutzer ist
8

Wie wäre es mit einer Verkürzung stringByAppendingStringund Verwendung eines #define :

#define and stringByAppendingString

So würden Sie verwenden:

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

Das Problem ist, dass es nur für zwei Zeichenfolgen funktioniert. Sie müssen zusätzliche Klammern einschließen, um weitere Anhänge zu erhalten:

NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
Sonntag Eisenfuß
quelle
Mit XCode7 können Sie diese Option nicht mehr verwenden - "und" ist ein reserviertes Wort. Sie können jedoch stattdessen "cat" für conCATenation verwenden. Ich habe es getan und Ihre Lösung funktioniert perfekt und ist extrem einfach.
Volomike
8
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
Gobi M.
quelle
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
quelle
6

Ich habe diesen Code ausprobiert. es hat bei mir funktioniert.

NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];
Erhan Demirci
quelle
2
Dies ist der schlimmste Missbrauch eines NSMutableString aller Zeiten. Der springende Punkt bei NSMutableString ist, dass Sie keine Methoden zum Erstellen von automatisch freigegebenen Zeichenfolgen benötigen, sondern die Zeichenfolge selbst ändern können.
Gnasher729
Zustimmen. Verwenden appendString:Sie zumindest, wenn Sie eine verwenden NSMutableString.
Benutzer, der kein Benutzer ist
6

Versucht die folgende in der lldbScheibe

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

welche Fehler.

Verwenden Sie stattdessen alloc und initWithFormatmethod:

[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
Anthony De Souza
quelle
1
... wünschte, ich hätte genug Ruf, um einen Kommentar abzugeben, hoffe aber, dass dies jemand anderem hilft.
Anthony De Souza
4

Dies dient der besseren Protokollierung und nur der Protokollierung - basierend auf der hervorragenden Mehrfachargument-Methode von dicius. Ich definiere eine Logger-Klasse und nenne sie so:

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

Fast gut, außer dass man die var args mit "nil" beenden muss, aber ich nehme an, dass es in Objective-C keinen Weg daran vorbei gibt.

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 

Um nur Zeichenfolgen zu verknüpfen , würde ich eine Kategorie in NSString definieren und eine statische (+) Verkettungsmethode hinzufügen, die genau wie die obige Protokollmethode aussieht, außer dass sie die Zeichenfolge zurückgibt. Es ist auf NSString, weil es eine Zeichenfolgenmethode ist, und es ist statisch, weil Sie eine neue Zeichenfolge aus 1-N-Zeichenfolgen erstellen möchten, und sie nicht für eine der Zeichenfolgen aufrufen, die Teil des Anhangs sind.

n13
quelle
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
quelle
3

Versuchen Sie stringWithFormat:

NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
CommanderHK
quelle
Warum hat dies 2 Downvotes? Liegt es daran, dass dies bereits in einer anderen Antwort erwähnt wurde?
Reimius
3

Wenn ich mich oft mit Strings beschäftige, fällt es mir leichter, die Quelldatei ObjC ++ zu erstellen, dann kann ich std :: strings mit der zweiten in der Frage gezeigten Methode verketten.

std::string stdstr = [nsstr UTF8String];

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

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

Meine bevorzugte Methode ist folgende:

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

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

Sie können dies erreichen, indem Sie die Join-Methode mit einer Kategorie zu NSArray hinzufügen:

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

@[] es ist die kurze Definition für NSArray , ich denke, dies ist die schnellste Methode, um Zeichenfolgen zu verketten.

Wenn Sie die Kategorie nicht verwenden möchten, verwenden Sie direkt die componentsJoinedByString:Methode:

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

Sie können NSArray als verwenden

NSString *string1=@"This"

NSString *string2=@"is just"

NSString *string3=@"a test"  

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

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

oder

Sie können verwenden

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

Jedes dieser Formate funktioniert in XCode7, als ich getestet habe:

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

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

Aus irgendeinem Grund benötigen Sie nur das @ -Operatorzeichen in der ersten Zeichenfolge der Mischung.

Es funktioniert jedoch nicht mit variabler Einfügung. Dafür können Sie diese extrem einfache Lösung verwenden, mit der Ausnahme, dass Sie ein Makro für "cat" anstelle von "und" verwenden.

Volomike
quelle
wie macht man das? zB: sTest3 = sTest1 + sTest2;
@ user285594 Das war der Punkt der Frage: Diese Syntax ist in Objective-C nicht erlaubt. Siehe die anderen Antworten.
Benutzer, der kein Benutzer ist
1

Für alle Objective C-Liebhaber, die dies in einem UI-Test benötigen:

-(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
quelle
0
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];
user4951
quelle
0

Stellen wir uns vor, Sie wissen nicht, wie viele Saiten es gibt.

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:@", "];
Ruhe dich aus
quelle