1178 votes

Comment concaténer des chaînes?

Existe-il des raccourcis (stringByAppendingString:) concaténation de chaîne en Objective-C ou des raccourcis pour travailler avec NSString ou d'autres objets en général?

Par exemple, je voudrais faire

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

quelque chose de plus comme

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

1186voto

diciu Points 18634

Une option:

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

Une autre option:

Je devine que vous n'êtes pas heureux avec de multiples ajoute (a+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;
}

633voto

Chris Blackwell Points 5514

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

Tout d'abord, utilisez un NSMutableString, ce qui a un appendString méthode, en supprimant une partie de la nécessité pour plus de temp cordes.

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

156voto

Johannes Fahrenkrug Points 12795

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

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

C'est également utile pour rejoindre #définit:

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

Profitez de.

86voto

Kyle Clegg Points 8441

Je reviens à ce poste et finissent toujours par le tri à travers les réponses à 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];

47voto

Palimondo Points 2337

Ainsi, comme le colon est une sorte de symbole spécial, mais est une partie de la signature de la méthode, il est possible de exted l' NSString de la catégorie d'ajouter cette non-idiomatiques style de concaténation de chaîne:

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

Vous pouvez définir autant de colon séparés arguments que vous le trouverez utile... ;-)

Pour une bonne mesure, j'ai aussi ajouté concat: à nombre variable d'arguments qui prend nil résilié liste de chaînes de caractères.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X