Question

Y a-t-il des raccourcis vers (stringByAppendingString:) concaténation de chaînes en Objective-C, ou des raccourcis pour travailler avec en général NSString?

Par exemple, je voudrais faire:

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

quelque chose comme:

string myString = "This";
string test = myString + " is just a test";
Était-ce utile?

La solution

Deux réponses que je peux penser ... ni est particulièrement aussi agréable que d'avoir simplement un opérateur de concaténation.

Tout d'abord, utilisez un NSMutableString, qui a une méthode appendString, en supprimant une partie de la nécessité pour les chaînes temporaires supplémentaires.

Deuxièmement, utiliser un NSArray pour concaténer via la méthode componentsJoinedByString.

Autres conseils

Une option:

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

Une autre option:

Je devine que vous n'êtes pas satisfait de plusieurs (a + ajouter ses b + c + d), auquel cas vous pourriez faire:

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

en utilisant quelque chose comme

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

Si vous avez 2 NSString littéraux , vous pouvez aussi faire ceci:

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

C'est aussi utile pour joindre #defines:

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

Profitez.

Je reviens toujours à ce poste et finissent toujours trier les réponses pour trouver cette solution simple qui fonctionne avec autant de variables que nécessaire:

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

Par exemple:

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

Eh bien, comme colon est une sorte de symbole spécial, mais est de signature de la méthode, il est possible de exted la catégorie avec NSString ajouter cette non idiomatiques style de concaténation de chaîne:

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

Vous pouvez définir autant d'arguments séparés du côlon que vous trouverez utiles ...; -)

Pour une bonne mesure, j'ai aussi ajouté des arguments variables concat: qui prend fin la liste des nil chaînes.

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

Créer une méthode:

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

Alors, quelle que soit la fonction dont vous avez besoin dans, définissez votre champ de chaîne ou d'un texte ou tout à la valeur de retour de cette fonction.

Ou, pour faire un raccourci, convertir le NSString en C ++ chaîne et utiliser le « + » il.

Utilisez cette façon:

NSString *string1, *string2, *result;

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

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

ou

result = [result stringByAppendingString:@"This is "];
result = [result stringByAppendingString:@"my string."];

Macro:

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

Test Cases:

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

macro Autre: (si vous vouliez faire respecter un nombre minimum d'arguments)

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

Lors de la construction des demandes de services web, je trouve en train de faire quelque chose comme ce qui suit est très facile et rend lisible concaténation dans 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>"
};

Raccourci en créant appendString (AS) macro ...

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

Remarque:

Si vous utilisez une macro, bien sûr tout faire avec des arguments variadique, voir la réponse de EthanB.

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

Voici une façon simple, en utilisant la nouvelle syntaxe littérale tableau:

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

Après quelques années maintenant avec Objective C Je pense que c'est la meilleure façon de travailler avec Objective C pour obtenir ce que vous essayez d'atteindre.

Démarrer tapant "N" dans votre application Xcode et autocompletes à "NSString". clé dans « str » et autocompletes à « stringByAppendingString ». Ainsi, les touches sont assez limitées.

Une fois que vous obtenez le coup de frapper le « @ » clé et le processus de tabulation écriture de code lisible ne devient plus un problème. Il est juste une question d'adaptation.

La seule façon de faire une plus courte est c = [a stringByAppendingString: b] à autocomplétion autour du point st. L'opérateur fait partie de + C, qui ne connaît pas les objets Objective-C.

Que diriez-vous de raccourcir et d'utiliser un stringByAppendingString #define :

#define and stringByAppendingString

vous donc utiliser:

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

Le problème est que cela ne fonctionne que pour deux chaînes, vous devez envelopper des crochets supplémentaires pour plus ajouter ses:

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

J'ai essayé ce code. il a travaillé pour moi.

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

tentais ce qui suit dans le volet lldb

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

qui erreurs.

utiliser à la place alloc et méthode initWithFormat:

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

Ceci est pour une meilleure exploitation forestière et l'exploitation forestière seulement - sur la base dicius excellente méthode d'arguments multiples. Je définit une classe d'enregistreur, et l'appeler comme ceci:

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

Presque bon, à l'exception d'avoir à mettre fin aux var args avec « nul » mais je suppose qu'il n'y a pas moyen de contourner cela en 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 

Pour que concat cordes, je définir une catégorie sur NSString et ajouter statique (+) méthode de concaténer à ce qui ressemble exactement à la méthode du journal ci-dessus, sauf qu'il retourne la chaîne. Il est sur NSString parce qu'il est une méthode de chaîne, et il est statique parce que vous voulez créer une nouvelle chaîne à partir de chaînes 1-N, pas appeler sur une des chaînes qui font partie de l'append.

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

Essayez stringWithFormat:

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

Lorsque vous traitez avec des chaînes souvent je trouve qu'il est plus facile de rendre le fichier source ObjC ++, je peux concaténer std :: cordes en utilisant la deuxième méthode indiquée dans la question.

std::string stdstr = [nsstr UTF8String];

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

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

Ma méthode préférée est la suivante:

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

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

Vous pouvez y arriver en ajoutant la méthode join à NSArray avec une catégorie:

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

@[] il est la définition courte pour NSArray, je pense que c'est la méthode la plus rapide pour concaténer des chaînes.

Si vous ne souhaitez pas utiliser la catégorie, utilisez directement la méthode componentsJoinedByString::

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

Vous pouvez utiliser NSArray comme

NSString *string1=@"This"

NSString *string2=@"is just"

NSString *string3=@"a test"  

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

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

ou

vous pouvez utiliser

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

Chacun de ces formats travaillent dans XCode7 quand je l'ai testé:

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

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

Pour une raison quelconque, il vous suffit le caractère opérateur @ sur la première chaîne du mélange.

Toutefois, il ne fonctionne pas avec insertion variable. Pour cela, vous pouvez utiliser cette solution extrêmement simple à l'exception de l'utilisation d'une macro sur « chat » au lieu de « et » .

Pour tous les amateurs Objective C qui ont besoin de cela dans une interface utilisateur-test:

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

En outre, vous pouvez utiliser pour le opérateur += même que ci-dessous ...

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

Imaginons que u ne sais pas combien de chaînes il.

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:@", "];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top