it-swarm.com.de

Verknüpfungen in Objective-C zum Verketten von NSStrings

Gibt es Verknüpfungen zur (stringByAppendingString:) Zeichenfolgenverknüpfung in Objective-C oder Verknüpfungen für die Arbeit mit NSString im Allgemeinen?

Zum Beispiel möchte ich machen:

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

etwas mehr wie:

string myString = "This";
string test = myString + " is just a test";
1097
typeoneerror

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

Verwenden Sie zunächst eine NSMutableString -Methode mit einer appendString -Methode, wodurch zusätzliche temporäre Zeichenfolgen nicht mehr erforderlich sind.

Zweitens verwenden Sie NSArray, um über die Methode componentsJoinedByString zu verketten.

605
Chris Blackwell

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;
}
1106
diciu

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.

148

Ich kehre immer wieder zu diesem Beitrag zurück und sortiere immer wieder 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];
69
Kyle Clegg

Nun, da Doppelpunkt eine Art spezielles Symbol ist, aber Teil der Methodensignatur ist, ist es möglich, die NSString mit der Kategorie zu erweitern, um diese hinzuzufügen non -idiomatic Art 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 ... ;-)

Als gute Maßnahme habe ich auch concat: mit variablen Argumenten hinzugefügt, die eine nil terminierte Liste von Zeichenfolgen enthalten.

//  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);
}
44
Palimondo

Erstellen Sie eine Methode:

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

Setzen Sie dann in der gewünschten Funktion Ihre Zeichenfolge, Ihr Textfeld oder was auch immer auf den Rückgabewert dieser Funktion.

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

42
Sidd Menon

Verwenden Sie diesen Weg:

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
Taimur Ajmal

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

Wenn ich Anfragen nach Webdiensten erstelle, finde ich Folgendes sehr einfach und die Verkettung ist 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>"
};
27
FreeAsInBeer

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

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

Anmerkung:

Wenn Sie ein Makro verwenden, verwenden Sie einfach verschiedene Argumente, siehe die Antwort von EthanB.

24
Jim Logan
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
coder284

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

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

Nach ein paar Jahren mit Objective C denke ich, dass dies der beste Weg ist, mit Objective C zu arbeiten, um das zu erreichen, was Sie erreichen möchten.

Starten Sie die Eingabe von "N" in Ihrer Xcode-Anwendung 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, drücken Sie die Taste "@" und das Schreiben von lesbarem Code wird nicht mehr zum Problem. Es ist nur eine Frage der Anpassung.

9
Ian Clay
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
8
Gobi M

Wie wäre es, wenn Sie stringByAppendingString kürzen und ein # define verwenden:

#define and stringByAppendingString

So würden Sie verwenden:

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

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

NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
8
Sunday Ironfoot

Die einzige Möglichkeit, c = [a stringByAppendingString: b] zu verkürzen, ist die Verwendung der automatischen Vervollständigung um den Punkt st. Der Operator + ist Teil von C, der keine Informationen zu Objective-C-Objekten hat.

8
user23743

Ich habe diesen Code ausprobiert. Es hat für mich funktioniert.

NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];
6
Erhan Demirci

Habe Folgendes im Bereich lldb versucht

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

welche fehler.

verwenden Sie stattdessen die Methode alloc und initWithFormat:

[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
6

Dies dient der besseren Protokollierung und nur der Protokollierung - basierend auf der hervorragenden Mehrfachargumentmethode von dicius. Ich definiere eine Logger-Klasse und bezeichne sie wie folgt:

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

Fast gut, außer dass die var-Argumente mit "nil" beendet werden müssen, aber ich nehme an, dass es in Objective-C keinen Ausweg 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 concat Zeichenfolgen zu definieren, würde ich eine Kategorie in NSString definieren und ihr eine statische (+) Verkettungsmethode hinzufügen, die genau wie die obige Protokollmethode aussieht, außer dass sie die Zeichenfolge zurückgibt. Es befindet sich in NSString, weil es eine Zeichenfolgemethode ist, und ist statisch, weil Sie eine neue Zeichenfolge aus 1-N-Zeichenfolgen erstellen möchten, und nicht in einer der Zeichenfolgen, die Teil des Anhangs sind.

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

Meine bevorzugte Methode ist diese:

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

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

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

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

@[] Dies ist die Kurzdefinition 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:@""];
3
LombaX

Versuchen Sie stringWithFormat:

NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];
3
CommanderHK

Wenn ich mich häufig mit Strings beschäftige, finde ich es einfacher, die Quelldatei ObjC++ zu erstellen. Dann kann ich std :: strings mit der in der Frage gezeigten zweiten Methode verketten.

std::string stdstr = [nsstr UTF8String];

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

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

Sie können NSArray als verwenden

NSString *[email protected]"This"

NSString *[email protected]"is just"

NSString *[email protected]"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];
3
Arun

Jedes dieser Formate funktioniert in XCode7, als ich es 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.

Beim Einfügen von Variablen funktioniert dies jedoch nicht. Dafür können Sie diese extrem einfache Lösung verwenden, mit der Ausnahme, dass Sie ein Makro für "cat" anstelle von "and" verwenden.

1
Volomike

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

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

In 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"

Sie können auch den += -Operator wie folgt verwenden ...

var str3 = "Some String" 
str3 += str2            // str3 would be "Some String is just a test"
0