Frage Verknüpfungen in Objective-C, um NSStrings zu verketten


Gibt es Abkürzungen zustringByAppendingString:) String-Verkettung in Objective-C oder Verknüpfungen zum Arbeiten mit NSString Im Algemeinen?

Zum Beispiel möchte ich Folgendes 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";

1050
2018-02-04 06:26


Ursprung


Antworten:


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

Verwenden Sie zuerst ein NSMutableString, die eine hat appendString Methode, einige der Notwendigkeit für zusätzliche temporäre Zeichenfolgen entfernen.

Zweitens, benutze ein NSArray verketten über die componentsJoinedByString Methode.


580
2018-02-04 06:44



Eine Option:

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

Andere Option:

Ich schätze, Sie sind nicht glücklich mit mehreren Anhängen (a + b + c + d), in diesem Fall könnten Sie tun:

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

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

1064
2018-02-04 07:53



Wenn Sie 2 NSString haben LiteraleDu kannst das auch einfach tun:

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

Das 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.


140
2018-03-17 11:59



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

Beispielsweise:

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

67
2017-08-11 06:51



Nun, als Doppelpunkt ist ein besonderes Symbol, aber ist Teil der Methodensignatur ist es möglich, die NSString mit Kategorie, um das hinzuzufügen nicht idiomatisch Art der Stringverkettung:

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

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

Für ein gutes Maß habe ich auch hinzugefügt concat: mit variablen Argumenten, die dauert nil Liste der Strings beendet.

//  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
2018-03-16 00:41



erstelle eine Methode ......

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

Dann, in welcher Funktion auch immer Sie es brauchen, setzen Sie Ihre Zeichenfolge oder textfield oder was auch immer der Rückgabewert dieser Funktion.

Oder Sie können eine Verknüpfung erstellen, indem Sie den NSString in eine C ++ - Zeichenfolge konvertieren und dort das '+' verwenden.

Hoffe das hilft!!!!!


35
2017-10-03 22:29



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

32
2017-07-26 16: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:@""]

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 wollten)

// 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
2018-05-31 17:07



Beim Erstellen von Anforderungen für Webdienste finde ich Folgendes sehr einfach und 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>"
};

27
2018-03-16 14:24



Verknüpfung durch Erstellen von AppendString (AS) Makro ...

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

Hinweis:

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


25
2017-07-18 05:38