Atajos en Objective-C para concatenar NSStrings


1129

¿Hay atajos para la stringByAppendingString:concatenación de cadenas ( ) en Objective-C o atajos para trabajar NSStringen general?

Por ejemplo, me gustaría hacer:

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

algo mas como:

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

44
Solo me gustaría proponer '@ +' como operador de concatenación. Esperaré esto en la próxima actualización de Objective-C, kthxbai
powerj1984

44
@NicolasMiari Esta no es la única característica que carece de Objective-C. Hay docenas de otros. Citando el enlace que Jordão publicó: "Objective-C es, para ser franco, un lenguaje primitivo. Compárelo con cualquier lenguaje moderno y rápidamente encontrará que le falta". Estoy de acuerdo. Objective-C (principios de la década de 1980) es C (principios de la década de 1970) con la adición de un tipo de POO muy simple y no muy seguro. Está bien, pero en comparación con Java o C #, se siente muy anticuado.
jcsahnwaldt dice GoFundMonica

55
@NicolasMiari: ¿lenguaje interpretado? C # y Java son lenguajes compilados. Compilado a bytecode, que luego se compila nuevamente a código de máquina.
Joren

3
Las cosas han cambiado ahora: Swift (nuevo idioma de Apple) es más sencillo
Pradeep

66
Con respecto a la "seguridad de tipo", creo que es un problema de estilo. Para alguien que viene de C # / C ++, tener matrices heterogéneas de objetos de cualquier tipo puede parecer extraño, pero para alguien acostumbrado a Objective-C / Cocoa, es una forma de dinamismo y libertad; es una ventaja siempre que sepa lo que está haciendo. Me gusta casi todo sobre C que los programadores más jóvenes critican en estos días ...
Nicolas Miari

Respuestas:


616

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

En primer lugar, utilice una NSMutableString, que tiene un appendStringmétodo, la eliminación de algunos de la necesidad de cadenas temporales adicionales.

Segundo, use un NSArraypara concatenar a través del componentsJoinedByStringmétodo.


34
Aunque la otra opción tiene muchos votos a favor, creo que esta es la mejor respuesta si no conoce todas sus cadenas en la construcción. Cada vez que agrega una cadena, está creando una gran sobrecarga. Usar una cadena mutable elimina ese problema.
Eli

22
+1 De acuerdo con @Eli. Estas son generalmente las mejores soluciones. NSArray -componentsJoinedByString se puede hacer en una sola línea bastante bien: string = [[NSArray arrayWithObjects: @ "This", "Is", "A", "Test", nil] componentsJoinedByString: @ ""];
Rob Napier

44
+1 por esta respuesta. [NSMutableString appendString]es más amigable con la memoria que [NSString stringByAppendingStrings].
Pierre-David Belanger

2
@RobNapier: ahora con la nueva sintaxis literal de matriz, es aún mejor.
Amogh Talpallikar

27
La [NSString stringWithFormat:@"%@/%@/%@", three, two, one];técnica parece la más elegante. Debería ser la respuesta seleccionada.
ekillaby

1129

Una opción:

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

Otra opción:

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

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

8
@pablasso De acuerdo. El método Util es bastante feo. Si desea tal cosa, debe hacerse como una categoría NSString con un nombre como + stringByAppendingStrings :. Incluso una función directa con un nombre como NSStringForAppendedStrings (...) sería mejor que un método estático en una clase como Util (cualquier cosa con "Util" en el nombre probablemente esté mal factorizada). La función también se implementa mejor con un NSMutableString y -appendString para evitar la creación de un conjunto ilimitado de NSStrings temporales con autorización automática.
Rob Napier

1
Con cadenas grandes esto puede desperdiciar memoria. Se recomienda algo más como StringBuilder en lenguajes de programación reales. Luego, podría calcular cuánta memoria se necesita antes de comenzar a agregar. El enfoque anterior podría ser refactorizado para hacer esto. Sin embargo, sería mejor hacer un objeto StringBuilder ya que esto evitaría que el usuario tenga que realizar un seguimiento de una lista de todas las cadenas que necesitan combinadas.
George

¿Cómo importas Util? este IDE es frustrante (no se sugiere "importar algo. Utilizar" como en eclipse, y no encuentro ninguna mención de "Util" en ninguna parte. ¿Se supone que esta es una clase que debo codificar?
Gubatron

stringWithFormat no solo es muy elegante, sino que también es mucho más potente. Lo usa con @ "% @% @" para concatenar dos cadenas, @ "% @% @% @" para concatenar tres cadenas, pero puede poner caracteres adicionales dentro, imprimir números, reordenar parámetros si lo desea, etc. . La cadena de formato se puede localizar, por lo que es diez veces más potente. La concatenación de cadenas es para principiantes.
gnasher729

150

Si tiene 2 literales NSString , también puede hacer esto:

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

Eso también es útil para unirse a #defines:

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

Disfrutar.


13
@ CristiBăluță :) Pero esto solo funciona con literales, no con instancias NSString creadas dinámicamente.
Johannes Fahrenkrug

99
En realidad no necesitas las @s en las cuerdas después de la primera. @"I" " really" " enjoy"...
Kevin

Probablemente desee colocar STRINGA y STRINGB entre paréntesis, de lo contrario, podría obtener resultados extraños cuando se resuelva la macro. #define JOINED (STRINGA STRINGB)
digory doo

@JohannesFahrenkrug Entonces, ¿por qué esto NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";no funciona? Tengo un Expected '@' in programerror :(
Vagif

@Vagif ¿cómo se TABLE_NAMEdefine?
Johannes Fahrenkrug

75

Sigo volviendo a esta publicación y siempre termino clasificando 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];

48

Crea un método:

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

Luego, en cualquier función en la que lo necesite, configure su cadena o campo de texto o lo que sea para el valor de retorno de esta función.

O, para hacer un acceso directo, convierta el NSString en una cadena de C ++ y use el '+' allí.


Esta es la solución más simple.
GeneCode

44

Bueno, como los dos puntos son una especie de símbolo especial, pero es parte de la firma del método, es posible salir de la NSStringcategoría con para agregar este estilo no idiomático de concatenación de cadenas:

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

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

Para una buena medida, también he agregado concat:argumentos variables que toman una nillista 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);
}

20
Voté esto hace un año porque no es una muy buena respuesta. Para hacer frente a la concatenación de una gran cantidad de cadenas, la implementación de Palimondo requiere implementar una gran cantidad de métodos de aspecto muy similares o llamar a los métodos varias veces, lo que resulta en una gran porción de código que esencialmente solo concatena cadenas. Con este enfoque, no obtienes ningún beneficio sobre un simple stringWithFormat:. Sin mencionar la falta de parámetros con nombre que no solo no es estándar sino que también es confuso.
FreeAsInBeer

2
El autor de la pregunta original mencionó stringByAppendingString, y nunca dijo nada sobre el uso de más de dos argumentos. Me gusta esta respuesta mejor que la aceptada. Es bastante inteligente
sudo

32

Use de stringByAppendingString:esta manera:

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

34
Te das cuenta de que estás sugiriendo exactamente lo que él no quería hacer, ¿verdad?
SilverSideDown

tanta fuga!
RamGrg

30

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

Casos de prueba:

- (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 alternativa: (si desea aplicar un número mínimo de argumentos)

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

2
No he revisado esta pregunta en mucho tiempo, ¡pero me inclino por aceptarla como la respuesta correcta después de todos estos años!
typeoneerror

1
Esto también podría decirse que tiene un mejor comportamiento que -[NSString stringByAppendingString:]para este caso de uso: con el primero obtendrá una excepción si el argumento es nilpero no si el receptor lo es. Por lo tanto, es probable que haya un 50% de probabilidades de que un error en su alimentador de cadenas falle silenciosamente y un 50% en una excepción. Con stringConcatusted tiene garantizada una excepción en cualquier nilparte de la lista. Lo que al menos es más predecible.
Tommy

27

Al crear solicitudes de servicios web, encuentro que hacer algo como lo siguiente es muy fácil y hace que la concatenación sea legible en 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>"
};

Para un novato objetivo-c, ¿puede explicar qué está haciendo esta sintaxis? ¿Esto está creando una serie de cadenas y uniéndolas de alguna manera? Una referencia a cualquier documento también sería genial.
Norman H

2
@ NormanH: Esto es en realidad parte del lenguaje C. Después de cavar un poco, pude encontrar esto . Establece bajo la fase de "Concatenación de cadenas": todos los literales de cadena ancha y cadena adyacente se concatenan. Por ejemplo, "Concatenación de cadenas" se convierte en "Concatenación de cadenas".
FreeAsInBeer

27

Atajo creando macro AppendString (AS) ...

# definir AS (A, B) [(A) stringByAppendingString: (B)]
NSString * myString = @ "Esto"; NSString * test = AS (myString, @ "es solo una prueba");

Nota:

Si usa una macro, por supuesto, hágalo con argumentos variables, vea la respuesta de EthanB.


¡Frio! Todavía creo que la Util anterior es una solución mucho más elegante; solo puede agregar una cadena con esta macro, ¿verdad?
typeoneerror

1
Es cierto que la macro AS anterior se agrega por línea de código. Si los anexos múltiples son una necesidad común, entonces se pueden crear más macros. Por ejemplo, una macro para agregar dos cadenas: <pre> #define A2S (A, B, C) [[(A) stringByAppendingString: (B)] stringByAppendingString: (C)] </pre>

2
O simplemente acorte la escritura requerida con una macro como "#define AS stringByAppendingString", luego use "AS" donde normalmente escribiría "stringByAppendingString" y disfrute de múltiples agregados por línea de código.

15
El problema con estas macros es que socavan uno de los objetivos principales de Objective-C, que es la legibilidad. No está muy claro lo que hace "AS". Guardar algunas pulsaciones de teclas (la mayoría de las cuales se manejan con autocompletado) a expensas de la legibilidad rara vez es una buena compensación. Hay excepciones (la sintaxis @ "" es mucho más legible que tener que usar + stringWithUTF8String: cada vez), pero el objetivo debería ser la legibilidad en lugar de la brevedad. Escribes una vez, pero depuras para siempre.
Rob Napier

Hola Rob, no puedo estar de acuerdo contigo en esto. Claro, "AS" es un mal nombre. Debería llamarse quizás "CAT".
Fattie

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

11

Aquí hay una manera simple, utilizando la nueva sintaxis literal de matriz:

NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                  ^^^^^^^ create array ^^^^^
                                               ^^^^^^^ concatenate ^^^^^

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

Después de un par de años con Objective CI, creo que esta es la mejor manera de trabajar con Objective C para lograr lo que está tratando de lograr.

Comience a escribir "N" en su aplicación Xcode y se autocompletará a "NSString". introduzca "str" ​​y se autocompletará a "stringByAppendingString". Por lo tanto, las pulsaciones de teclas son bastante limitadas.

Una vez que se acostumbra a presionar la tecla "@" y tabular el proceso de escribir código legible ya no se convierte en un problema. Es solo una cuestión de adaptación.


Te das cuenta de que estás sugiriendo exactamente lo que él no quería hacer, ¿verdad?
Usuario que no es usuario

8

La única forma de c = [a stringByAppendingString: b]acortar es usar autocompletar alrededor del stpunto. El +operador es parte de C, que no conoce los objetos Objective-C.


Te das cuenta de que estás sugiriendo exactamente lo que él quería no hacer, ¿verdad? Como mínimo, se #definepodría usar a para acortarlo.
Usuario que no es usuario

8

¿Qué tal acortar stringByAppendingStringy usar un #define :

#define and stringByAppendingString

Así usarías:

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

El problema es que solo funciona para dos cadenas, debe ajustar corchetes adicionales para más apéndices:

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

XCode7 ya no le permitirá usar esta opción: dice "y" es una palabra reservada. Sin embargo, puede usar "cat" en su lugar, para conCATenation. Lo hice y su solución funciona perfectamente y es extremadamente simple.
Volomike

8
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];

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

6

Probé este código. Me ha funcionado.

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

2
Este es el peor abuso de una NSMutableString. El objetivo de NSMutableString es que no necesita métodos para crear cadenas autorrelegadas, pero puede modificar la cadena en sí.
gnasher729

De acuerdo. Al menos úsalo appendString:si estás usando a NSMutableString.
Usuario que no es usuario

6

Estaba intentando lo siguiente en el lldbpanel

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

que errores

en su lugar use alloc y initWithFormatmétodo:

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

1
... desearía tener suficiente reputación para comentar, pero espero que esto ayude a alguien más.
Anthony De Souza

4

Esto es para un mejor registro, y solo para el registro, basado en un excelente método de argumento múltiple dicius. Defino una clase Logger y la llamo así:

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

Casi bueno, excepto tener que terminar los argumentos de var con "nulo", pero supongo que no hay forma de evitarlo 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 

Para solo concatenar cadenas, definiría una Categoría en NSString y agregaría un método de concatenación estático (+) que se ve exactamente como el método de registro anterior, excepto que devuelve la cadena. Está en NSString porque es un método de cadena, y es estático porque desea crear una nueva cadena a partir de cadenas 1-N, no invocarla en ninguna de las cadenas que forman parte del anexo.


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

3

Prueba stringWithFormat:

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

¿Por qué esto tiene 2 votos negativos? ¿Es porque esto ya se mencionó en otra respuesta?
Reimius

3

Cuando trato con cadenas a menudo me resulta más fácil hacer el archivo fuente ObjC ++, entonces puedo concatenar cadenas std :: usando el segundo método que se muestra en la pregunta.

std::string stdstr = [nsstr UTF8String];

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

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

3

Mi método preferido es este:

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

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

Puede lograrlo agregando el método de unión a NSArray con una categoría:

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

@[]es la definición corta de NSArray, creo que este es el método más rápido para concatenar cadenas.

Si no desea usar la categoría, use directamente el componentsJoinedByString:método:

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

3

Puedes usar NSArray como

NSString *string1=@"This"

NSString *string2=@"is just"

NSString *string3=@"a test"  

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

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

o

puedes usar

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

1

Cualquiera de estos formatos funciona en XCode7 cuando probé:

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

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

Por alguna razón, solo necesita el carácter de operador @ en la primera cadena de la mezcla.

Sin embargo, no funciona con inserción variable. Para eso, puede usar esta solución extremadamente simple con la excepción de usar una macro en "cat" en lugar de "y".


¿Cómo hacer esto? por ejemplo: sTest3 = sTest1 + sTest2;

@ user285594 Ese fue el punto de la pregunta: esa sintaxis no está permitida en Objective-C. Ver las otras respuestas.
Usuario que no es usuario

1

Para todos los amantes del objetivo C que necesitan esto en una prueba de interfaz de usuario:

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

0
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];

0

Imaginemos que no sabes cuántas cuerdas hay.

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:@", "];
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.