Scorciatoie in Objective-C per concatenare le stringhe NSS


1129

Esistono collegamenti a ( stringByAppendingString:) concatenazione di stringhe in Objective-C o collegamenti con cui lavorare NSStringin generale?

Ad esempio, vorrei fare:

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

qualcosa di più simile a:

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

4
Vorrei solo proporre "@ +" come operatore di concatenazione. Lo aspetterò nel prossimo aggiornamento di Objective-C, kthxbai
powerj1984,

44
@NicolasMiari Questa non è l'unica caratteristica che manca a Objective-C. Ce ne sono dozzine di altri. Citando il link pubblicato da Jordão: "Obiettivo-C è, per essere schietto, un linguaggio primitivo. Confrontalo con qualsiasi linguaggio moderno e lo trovi rapidamente carente." Sono d'accordo. Objective-C (primi anni '80) è C (primi anni '70) con l'aggiunta di un tipo di OOP molto semplice e poco sicuro. Va bene, ma rispetto a Java o C #, sembra molto vecchio stile.
jcsahnwaldt dice GoFundMonica il

5
@NicolasMiari: lingua interpretata? C # e Java sono linguaggi compilati. Compilato in bytecode, che viene quindi nuovamente compilato in codice macchina.
Joren,

3
Le cose sono cambiate ora: Swift (la nuova lingua di Apple) è più semplice
Pradeep l'

6
Per quanto riguarda la "sicurezza dei tipi", penso che sia un problema di stile. Per qualcuno che proviene da C # / C ++, avere array eterogenei di oggetti di qualsiasi tipo può sembrare strano, ma per qualcuno abituato a Objective-C / Cocoa, è una forma di dinamismo e libertà; è un vantaggio purché tu sappia cosa stai facendo. Piace praticamente tutto ciò che riguarda i C che i giovani programmatori colpiscono in questi giorni ...
Nicolas Miari,

Risposte:


616

Due risposte che mi vengono in mente ... nessuna delle due è particolarmente piacevole come avere un operatore di concatenazione.

Per prima cosa, usa un NSMutableString, che ha un appendStringmetodo, eliminando la necessità di stringhe di temperatura extra.

In secondo luogo, utilizzare un NSArrayper concatenare tramite il componentsJoinedByStringmetodo.


34
Sebbene l'altra opzione abbia molti voti, penso che questa sia la risposta migliore se non conosci tutte le tue stringhe durante la costruzione. Ogni volta che aggiungi una stringa, stai creando un sacco di sovraccarico. L'uso di una stringa mutabile rimuove quel problema.
Eli,

22
+1 Accetto w @Eli. Queste sono generalmente le migliori soluzioni. NSArray -componentsJoinedByString può essere eseguito abbastanza bene in una singola riga: string = [[NSArray arrayWithObjects: @ "This", "Is", "A", "Test", nil] componentsJoinedByString: @ ""];
Rob Napier,

4
+1 per questa risposta. [NSMutableString appendString]è più memoria amichevole di [NSString stringByAppendingStrings].
Pierre-David Belanger,

2
@RobNapier: ora con la nuova sintassi letterale dell'array, è ancora meglio.
Amogh Talpallikar,

27
La [NSString stringWithFormat:@"%@/%@/%@", three, two, one];tecnica sembra la più elegante. Dovrebbe essere la risposta selezionata.
ekillaby,

1129

Un opzione:

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

Un'altra opzione:

Immagino che non sei soddisfatto di più appendi (a + b + c + d), nel qual caso potresti fare:

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

usando qualcosa di simile

+ (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 Concordato. Il metodo Util è piuttosto brutto. Se vuoi una cosa del genere, dovrebbe essere fatta come una categoria NSString con un nome come + stringByAppendingStrings :. Anche una funzione semplice con un nome come NSStringForAppendedStrings (...) sarebbe meglio di un metodo statico in una classe come Util (qualsiasi cosa con "Util" nel nome è probabilmente scarsamente ponderata). La funzione è inoltre implementata meglio con un NSMutableString e -appendString per evitare la creazione di un set illimitato di NSString temporanee con rilascio automatico.
Rob Napier,

1
Con stringhe di grandi dimensioni ciò può sprecare memoria. Consigliato è qualcosa di più simile a StringBuilder nei linguaggi di programmazione reali. Quindi potresti solo capire quanta memoria è necessaria prima di iniziare effettivamente ad aggiungere. L'approccio sopra potrebbe essere riformulato per fare questo. Tuttavia, sarebbe meglio creare un oggetto StringBuilder poiché ciò eviterebbe all'utente di dover tenere traccia di un elenco di tutte le stringhe di cui hanno bisogno.
George,

come si importa Util? questo IDE è frustrante (nessun suggerito "importa qualcosa.
Fino a

stringWithFormat non è solo molto elegante, ma è anche molto più potente. Lo usi con @ "% @% @" per concatenare due stringhe, @ "% @% @% @" per concatenare tre stringhe, ma puoi inserire eventuali caratteri extra all'interno, stampare numeri, riordinare i parametri se vuoi e così via . La stringa di formato può essere localizzata, rendendola dieci volte più potente. La concatenazione di stringhe è per principianti.
gnasher729,

150

Se hai 2 letterali NSString , puoi anche fare questo:

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

Questo è utile anche per unirti a #defines:

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

Godere.


13
@ CristiBăluță :) Funziona solo con valori letterali non con istanze NSString create dinamicamente.
Johannes Fahrenkrug,

9
In realtà non hai bisogno delle @s sulle corde dopo la prima. @"I" " really" " enjoy"...
Kevin,

Probabilmente dovresti mettere STRINGA e STRINGB tra parentesi, altrimenti potresti ottenere strani risultati quando la macro viene risolta. #define JOINED (STRINGA STRINGB)
digory doo

@JohannesFahrenkrug Allora perché questo NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";non funziona? Sto Expected '@' in programriscontrando un errore :(
Vagif

@Vagif come viene TABLE_NAMEdefinito?
Johannes Fahrenkrug,

75

Continuo a tornare a questo post e finisco sempre con l'ordinare le risposte per trovare questa semplice soluzione che funziona con tutte le variabili necessarie:

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

Per esempio:

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

48

Crea un metodo:

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

Quindi, in qualunque funzione ti serva, imposta la stringa o il campo di testo o qualunque cosa sul valore restituito di questa funzione.

Oppure, per creare una scorciatoia, converti NSString in una stringa C ++ e usa il '+' lì.


Questa è la soluzione più semplice.
GeneCode

44

Bene, poiché i due punti sono una specie di simbolo speciale, ma fanno parte della firma del metodo, è possibile estendere la NSStringcategoria with per aggiungere questo stile non idiomatico di concatenazione di stringhe:

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

Puoi definire quanti argomenti separati da due punti quanti ne ritieni utili ... ;-)

Per una buona misura, ho anche aggiunto concat:con argomenti variabili che accetta l' nilelenco di stringhe terminato.

//  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
L'ho sottovalutato un anno fa perché non è un'ottima risposta. Per far fronte alla concatenazione di un gran numero di stringhe, l'implementazione di Palimondo richiede l'implementazione di un gran numero di metodi dall'aspetto molto simile o la chiamata più volte dei metodi, risultando in un grosso blocco di codice che essenzialmente concatena semplicemente le stringhe. Utilizzando questo approccio, non si ottiene alcun vantaggio rispetto a un semplice stringWithFormat:. Per non parlare della mancanza di parametri nominati che non è solo non standard ma anche confuso.
FreeAsInBeer

2
Il richiedente originale ha menzionato stringByAppendingStringe non ha mai detto nulla sull'uso di più di due argomenti. Mi piace questa risposta meglio di quella accettata. È abbastanza intelligente.
sudo,

32

Usa in stringByAppendingString:questo modo:

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
Ti rendi conto che stai suggerendo la cosa esatta che voleva non fare, giusto?
SilverSideDown

così tante perdite!
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:@""]

Casi test:

- (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: (se si desidera imporre un numero minimo di argomenti)

// 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
Non ho controllato questa domanda da un po ', ma mi sto proponendo di accettarla come la risposta giusta dopo tutti questi anni!
typeoneerror,

1
Anche questo ha probabilmente un comportamento migliore rispetto -[NSString stringByAppendingString:]a questo caso d'uso - con il primo otterrai un'eccezione se l'argomento è nilma non se lo è il destinatario. Quindi è presumibilmente il 50% di probabilità su un errore nel vostro alimentatore di fili che non funziona in modo silenzioso e il 50% su un'eccezione. Con stringConcatsei garantito un'eccezione su qualsiasi nil, in qualsiasi parte dell'elenco. Che almeno è più prevedibile.
Tommy,

27

Quando costruisco richieste per servizi web, trovo che fare qualcosa di simile al seguente sia molto semplice e rende la concatenazione leggibile in 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>"
};

Per un noob obiettivo-c puoi spiegare cosa sta facendo questa sintassi? Sta creando una serie di stringhe e unendole in qualche modo? Anche un riferimento a qualsiasi documento sarebbe interessante.
Norman H,

2
@NormanH: in realtà fa parte del linguaggio C. Dopo un po 'di scavo, sono stato in grado di trovare questo . Indica nella fase "Concatenazione di stringhe": tutti i letterali di stringhe e stringhe adiacenti vengono concatenati. Ad esempio, "String" "concatenazione" diventa "Concatenazione di stringhe".
FreeAsInBeer,

27

Collegamento creando macro AppendString (AS) ...

#define AS (A, B) [(A) stringByAppendingString: (B)]
NSString * myString = @ "Questo"; NSString * test = AS (myString, @ "è solo un test");

Nota:

Se usi una macro, ovviamente fallo solo con argomenti variadici, vedi la risposta di EthanB.


Freddo! Penso ancora che l'Utile sopra sia una soluzione molto più elegante; puoi aggiungere solo una stringa con questa macro, giusto?
typeoneerror,

1
È vero, la macro AS sopra fa un'appendice per riga di codice. Se più aggiunte sono un'esigenza comune, è possibile creare più macro. Ad esempio, una macro per aggiungere due stringhe: <pre> #define A2S (A, B, C) [[(A) stringByAppendingString: (B)] stringByAppendingString: (C)] </pre>

2
Oppure, accorcia semplicemente la digitazione richiesta con una macro come "#define AS stringByAppendingString", quindi usa semplicemente "AS" dove normalmente digiti "stringByAppendingString" e goditi più append per riga di codice.

15
Il problema con queste macro è che minano uno dei principali obiettivi di Objective-C, che è la leggibilità. Non è molto chiaro cosa faccia "AS". Il salvataggio di alcuni tasti (la maggior parte dei quali viene gestita con il completamento automatico) a scapito della leggibilità è raramente un buon compromesso. Ci sono eccezioni (la sintassi @ "" è molto più leggibile che dover usare + stringWithUTF8String: ogni volta), ma l'obiettivo dovrebbe essere comunque la leggibilità piuttosto che la semplice brevità. Scrivi una volta, ma esegui il debug per sempre.
Rob Napier,

Ciao Rob - Non posso essere d'accordo con te in questo. Certo, "AS" è un brutto nome. Dovrebbe essere chiamato forse "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

Ecco un modo semplice, usando la nuova sintassi letterale di array:

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

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

Dopo un paio d'anni con Objective CI, penso che questo sia il modo migliore per lavorare con Objective C per raggiungere ciò che stai cercando di ottenere.

Inizia a digitare "N" nell'applicazione Xcode e si completa automaticamente in "NSString". digitare "str" ​​e si completa automaticamente in "stringByAppendingString". Quindi i tasti sono abbastanza limitati.

Una volta che hai capito di premere il tasto "@" e di eseguire la tabulazione, il processo di scrittura del codice leggibile non diventa più un problema. È solo una questione di adattamento.


Ti rendi conto che stai suggerendo la cosa esatta che voleva non fare, giusto?
Utente che non è un utente il

8

L'unico modo per ridurre c = [a stringByAppendingString: b]i tempi è utilizzare il completamento automatico intorno al stpunto. L' +operatore fa parte di C, che non conosce oggetti Objective-C.


Ti rendi conto che stai suggerendo la cosa esatta che voleva non fare, giusto? Per lo meno, a #definepotrebbe essere usato per accorciarlo.
Utente che non è un utente il

8

Che ne dici di accorciare stringByAppendingStringe usare un #define :

#define and stringByAppendingString

Quindi useresti:

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

Il problema è che funziona solo per due stringhe, è necessario avvolgere parentesi aggiuntive per più aggiunte:

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

XCode7 non ti consentirà più di utilizzare questa opzione - dice "e" è una parola riservata. Tuttavia, puoi usare "cat" invece, per la conCATenazione. L'ho fatto e la tua soluzione funziona perfettamente ed è estremamente semplice.
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

Ho provato questo codice. ha funzionato per me.

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

2
Questo è il peggior abuso di un NSMutableString di sempre. L'intero punto di NSMutableString è che non sono necessari metodi per creare stringhe con rilascio automatico ma è possibile modificare la stringa stessa.
gnasher729,

Essere d'accordo. Almeno usa appendString:se stai usando a NSMutableString.
Utente che non è un utente il

6

Stava provando quanto segue nel lldbriquadro

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

quali errori.

utilizzare invece alloc e initWithFormatmetodo:

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

1
... vorrei avere abbastanza reputazione per commentare, ma spero che questo aiuti qualcun altro.
Anthony De Souza,

4

Questo serve per una migliore registrazione e registrazione - basata sul metodo a argomento multiplo eccellente dicius. Definisco una classe Logger e la chiamo così:

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

Quasi bene, tranne per il fatto di dover terminare le discussioni con "zero", ma suppongo che non ci sia modo di aggirarlo in 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 

Per soli concat corde, mi piacerebbe definire una categoria sulla NSString e aggiungi un metodo statico (+) concatena ad esso che appare esattamente come il metodo di registro di cui sopra, eccetto che restituisce la stringa. È su NSString perché è un metodo stringa ed è statico perché si desidera creare una nuova stringa da stringhe 1-N, non chiamarla su nessuna delle stringhe che fanno parte dell'appendice.


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

3

Prova stringWithFormat:

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

Perché questo ha 2 voti negativi? È perché questo è già stato menzionato in un'altra risposta?
Reimius,

3

Quando ho a che fare con le stringhe spesso trovo più facile rendere il file sorgente ObjC ++, quindi posso concatenare std :: stringhe usando il secondo metodo mostrato nella domanda.

std::string stdstr = [nsstr UTF8String];

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

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

3

Il mio metodo preferito è questo:

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

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

È possibile ottenerlo aggiungendo il metodo join a NSArray con una categoria:

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

@[] è la definizione breve per NSArray , penso che questo sia il metodo più veloce per concatenare le stringhe.

Se non si desidera utilizzare la categoria, utilizzare direttamente il componentsJoinedByString:metodo:

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

3

È possibile utilizzare NSArray come

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

Puoi usare

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

1

Uno di questi formati funziona in XCode7 quando ho testato:

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

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

Per qualche motivo, è necessario solo il carattere di operatore @ sulla prima stringa del mix.

Tuttavia, non funziona con l'inserimento variabile. Per questo, è possibile utilizzare questa soluzione estremamente semplice, ad eccezione dell'utilizzo di una macro su "gatto" anziché "e".


come farlo? ad es .: sTest3 = sTest1 + sTest2;

@ user285594 Quello era il punto della domanda: quella sintassi non era permessa in Objective-C. Vedi le altre risposte.
Utente che non è un utente il

1

Per tutti gli amanti dell'obiettivo C che ne hanno bisogno in un test dell'interfaccia utente:

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

Immaginiamo che tu non sappia quante stringhe ci sono.

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:@", "];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.