Frage

Gibt es irgendwelche Verknüpfungen (stringByAppendingString:) String-Verkettung in Objective-C, oder Abkürzungen für die Arbeit mit NSString im Allgemeinen?

Zum Beispiel würde ich gerne machen:

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

etwas wie:

string myString = "This";
string test = myString + " is just a test";
War es hilfreich?

Lösung

Zwei Antworten, die ich denken kann ... weder besonders so angenehm wie nur einen Verkettungsoperator ist.

Verwenden Sie zuerst eine NSMutableString, die eine appendString Methode hat, für zusätzlichen temporären Strings einige der Notwendigkeit, zu entfernen.

Zweitens verwendet eine NSArray über die componentsJoinedByString Methode verketten.

Andere Tipps

Eine Option:

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

Eine weitere Option:

Ich vermute, Sie mit mehreren Appends nicht zufrieden sind (a + b + c + d), in dem Fall, dass Sie tun können:

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

Wenn Sie 2 NSString haben Literalen können Sie auch dies nur tun:

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

Das ist auch nützlich für den Beitritt #defines:

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

Genießen.

ich auf dieses Thema immer wiederkommen und immer durch die Antworten am Ende Sortieranlage diese einfache Lösung zu finden, die mit so vielen Variablen arbeitet je nach Bedarf:

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

Zum Beispiel:

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

Nun, wie Kolon Art spezielles Symbol ist, sondern ist Teil der Methodensignatur, ist es möglich, die NSString mit Kategorie exted dies hinzuzufügen nicht-idiomatische Stil von String-Verkettung:

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

Sie können so viele Doppelpunkt getrennt Argumente definieren, wie Sie nützlich finden ...; -)

Für eine gute Maßnahme, ich habe auch concat: mit variablen Argumenten hinzugefügt, die nil beendet Liste von Strings nimmt.

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

Erstellen Sie eine Methode:

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

Dann in welcher Funktion Sie es in benötigen, setzen Sie die Zeichenfolge oder ein Textfeld oder was auch immer auf den Rückgabewert dieser Funktion.

Oder, um eine Verknüpfung zu machen, konvertieren Sie das NSString in ein C ++ String und verwenden Sie die '+' gibt.

Verwenden Sie diese Art und Weise:

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."];

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

Alternate Makro: (wenn man will eine minimale Anzahl von Argumenten erzwingen)

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

Wenn die Anforderung von Web-Service bauen, finde ich etwas zu tun, wie die folgende ist sehr einfach und macht Verkettung lesbar in 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>"
};

Verknüpfung durch die Schaffung AppendString (AS) Makro ...

#define AS(A,B)    [(A) stringByAppendingString:(B)]
NSString *myString = @"This"; NSString *test = AS(myString,@" is just a test");

Hinweis:

einen Makro Bei der Verwendung von, natürlich tut es nur mit variadische Argumenten finden EthanB Antwort.

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];

Hier ist eine einfache Art und Weise, die neue Arrayliteral Syntax:

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

Nach ein paar Jahren mit Objective C Ich denke, dies ist der beste Weg mit Objective C zu arbeiten, um zu erreichen, was Sie erreichen wollen.

Starten Sie in "N" in Ihrer Xcode Anwendung Keying und autocompletes auf "NSString". Schlüssel in „str“ und es autocompletes auf „stringByAppendingString“. So sind die Tastenanschläge recht begrenzt.

Sobald Sie den Dreh des Schlagens des „@“ -Taste und der Tabulatortaste den Prozess des Schreibens lesbaren Code nicht mehr bekommen wird zu einem Problem. Es ist nur eine Frage der Anpassung.

Der einzige Weg, um c = [a stringByAppendingString: b] jeden kürzer ist die automatische Vervollständigung zu verwenden, um rund um den st Punkt. Der + Operator ist ein Teil von C, das nicht weiß, über Objective-C-Objekte.

Wie wäre es stringByAppendingString Verkürzung und verwenden ein #define :

#define and stringByAppendingString

So verwenden Sie:

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

Das Problem ist, dass es nur für zwei Strings arbeitet, sind Sie verpflichtet, für mehr Appends zusätzliche Klammern zu wickeln:

NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
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];

habe ich versucht, diesen Code. es ist für mich gearbeitet.

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

Wurde die folgenden im lldb Bereich versuchen

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

, welche Fehler.

anstelle alloc und initWithFormat Methode verwenden:

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

Dies ist für eine bessere Protokollierung und Protokollierung nur - basierend auf dicius ausgezeichneter mehr Argument-Methode. I eine Logger-Klasse definieren, und nennen Sie es wie folgt:

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

Fast gut, außer mit dem var args mit „Null“ zu beenden, aber ich nehme an, es gibt keinen Weg, um das in 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 

Um nur Concat Saiten, würde ich eine Kategorie auf NSString definieren und eine statische (+) verketten Methode, um es hinzuzufügen, die über genau wie die Log-Methode sieht außer es die Zeichenfolge zurückgibt. Es ist auf NSString, weil es eine String-Methode ist, und es ist statisch, weil Sie eine neue Zeichenfolge aus 1-N Strings erstellen mögen, ist es nicht auf einen des Strings nennen, den Teil des Append ist.

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

Versuchen string:

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

Wenn Sie mit Strings zu tun oft finde ich es einfacher, die Quelldatei ObjC ++ zu machen, dann kann ich std :: strings mit der zweiten Methode in der Frage gezeigt verketten.

std::string stdstr = [nsstr UTF8String];

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

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

Meine bevorzugte Methode ist folgende:

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

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

Sie können es erreichen, indem die Verknüpfungsmethode zu NSArray mit einer Kategorie hinzu:

#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 ist Strings zu verketten.

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

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

Sie können NSArray verwenden, wie

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 verwenden können,

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

Jedes dieser Formate arbeiten in XCode7 wenn ich getestet:

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 müssen Sie nur den Operator @ Zeichen der ersten Zeichenfolge der Mischung.

Allerdings ist es nicht mit variablen Einfügen arbeiten. Dafür können Sie verwenden diese extrem einfache Lösung mit Ausnahme eines Makros auf „cat“ anstelle von „und“ .

Für alle Objective C-Liebhaber, die diese in einem UI-Test-Voraussetzungen:

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

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 aber auch += Operator für die selben wie unten ...

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

Lassen Sie uns vorstellen, dass u nicht wissen, wie viele Strings 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:@", "];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top