Pregunta Accesos directos en Objective-C para concatenar NSStrings


¿Hay accesos directos a (stringByAppendingString:) concatenación de cadenas en Objective-C, o atajos para trabajar con NSString ¿en general?

Por ejemplo, me gustaría hacer:

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

algo más como:

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

1050
2018-02-04 06:26


origen


Respuestas:


Se me ocurren dos respuestas ... ninguna de las dos es tan agradable como tener un operador de concatenación.

Primero, usa un NSMutableString, que tiene un appendString método, eliminando algo de la necesidad de cadenas temporales adicionales.

Segundo, usa un NSArray para concatenar a través del componentsJoinedByString método.


580
2018-02-04 06:44



Una opción:

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

Otra opción:

Supongo que no está contento con múltiples adjuntos (a + b + c + d), en cuyo caso podría:

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

usando algo como

+ (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 tiene 2 NSString literales, también puedes hacer esto:

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

Eso también es útil para unir #defines:

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

Disfrutar.


140
2018-03-17 11:59



Sigo volviendo a esta publicación y siempre termino ordenando las respuestas para encontrar esta solución simple que funciona con tantas variables como sea necesario:

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

Por ejemplo:

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

67
2017-08-11 06:51



Bueno, como el colon es un símbolo especial, pero es parte de la firma del método, es posible exted el NSString con categoría para agregar esto no idiomático estilo de concatenación de cadenas:

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

Puede definir tantos argumentos separados por dos puntos como le parezca útil ... ;-)

Para una buena medida, también he agregado concat: con argumentos variables que toma nil lista terminada de cadenas

//  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



crea un método ......

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

Luego, en cualquier función que necesite, configure su cadena o textfield o lo que sea al valor de retorno de esta función.

O lo que puede hacer para hacer un atajo es convertir el NSString en una cadena de c ++ y usar el '+' allí.

¡¡¡¡¡Espero que esto ayude!!!!!


35
2017-10-03 22:29



Use esta forma:

NSString *string1, *string2, *result;

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

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

O

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

32
2017-07-26 16:04