Question Raccourcis dans Objective-C pour concaténer NSStrings


Y a-t-il des raccourcis vers (stringByAppendingString:) concaténation de chaînes dans Objective-C, ou des raccourcis pour travailler avec NSString 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";

1050
2018-02-04 06:26


origine


Réponses:


Deux réponses auxquelles je peux penser ... ni l'une ni l'autre n'est aussi agréable que d'avoir un opérateur de concaténation.

D'abord, utilisez un NSMutableString, qui a un appendString méthode, supprimant une partie du besoin de chaînes de temp supplémentaires.

Deuxièmement, utilisez un NSArray concaténer via le componentsJoinedByString méthode.


580
2018-02-04 06:44



Une option:

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

Une autre option:

Je suppose que vous n'êtes pas satisfait de plusieurs ajouts (a + b + c + d), auquel cas vous pouvez 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;
}

1064
2018-02-04 07:53



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

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

C'est aussi utile pour rejoindre #defines:

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

Prendre plaisir.


140
2018-03-17 11:59



Je continue de revenir à ce post et finis toujours par 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];

67
2017-08-11 06:51



Eh bien, comme le colon est une sorte de symbole spécial, mais est partie de la signature de la méthode, il est possible d'étendre la NSString avec la catégorie pour ajouter ceci non-idiomatique style de concaténation de chaînes:

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

Vous pouvez définir autant d'arguments séparés par deux points que vous trouvez utiles ... ;-)

Pour une bonne mesure, j'ai aussi ajouté concat: avec des arguments variables qui prend nil liste terminée des 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);
}

43
2018-03-16 00:41



créer une méthode ......

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

Ensuite, quelle que soit la fonction dont vous avez besoin, réglez votre chaîne ou textfield ou quoi que ce soit à la valeur de retour de cette fonction.

Ou ce que vous pouvez faire pour créer un raccourci est de convertir le NSString en une chaîne c ++ et d'utiliser le '+' ici.

J'espère que cela t'aides!!!!!


35
2017-10-03 22:29



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

32
2017-07-26 16:04