Domanda

Esistono scorciatoie per (stringByAppendingString:) concatenazione di stringhe in Objective-C o scorciatoie con cui lavorare NSString generalmente?

Ad esempio, vorrei realizzare:

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";
È stato utile?

Soluzione

Due risposte mi viene in mente ... non è particolarmente piacevole come solo avere un operatore di concatenazione.

In primo luogo, utilizzare un NSMutableString, che ha un metodo appendString, rimuovendo alcune delle necessità per le stringhe di temp extra.

In secondo luogo, utilizzare un NSArray per concatenare tramite il metodo componentsJoinedByString.

Altri suggerimenti

Un'opzione:

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

Un'altra opzione:

Sto indovinando non sei felice con più accodamento (a + b + c + d), nel qual caso si potrebbe fare:

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

usando qualcosa come

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

Se avete 2 NSString letterali , si può anche solo fare questo:

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

Questo è utile anche per unire #defines:

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

Enjoy.

Continuo a tornare in questo post e finiscono sempre ordinamento attraverso le risposte a trovare questa soluzione semplice che funziona con il maggior numero di variabili in base alle esigenze:

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

Ad esempio:

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

Bene, come del colon è una specie di simbolo speciale, ma è parte della firma del metodo, è possibile exted il NSString con categoria per aggiungere questo non idiomatica stile di concatenazione di stringhe:

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

È possibile definire tutte le argomentazioni dei due punti separati come trovare utile ...; -)

Per una buona misura, ho anche aggiunto concat: con argomenti variabili che prende nil lista di stringhe terminati.

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

Creare un metodo:

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

Poi, in qualsiasi funzione è necessario in, impostare il campo di stringa o di testo o qualsiasi altra cosa per il valore di ritorno di questa funzione.

In alternativa, per fare un collegamento, convertire il NSString in una stringa C ++ e utilizzare il '+' lì.

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

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

Test Cases:

- (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 alternativo: (se si voleva 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:@""];

Quando si costruisce le richieste per i servizi web, trovo facendo qualcosa di simile a quanto segue è 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>"
};

Collegamento con la creazione di AppendString (AS) macro ...

#define AS(A,B)    [(A) stringByAppendingString:(B)]
NSString *myString = @"This"; NSString *test = AS(myString,@" is just a test");

Nota:

Se si utilizza una macro, ovviamente basta farlo con argomenti variadic, vedere la risposta di EthanB.

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

Ecco un modo semplice, utilizzando la nuova sintassi letterale array:

NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                  ^^^^^^^ create array ^^^^^
                                               ^^^^^^^ concatenate ^^^^^
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];

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

Inizia a digitare "N" nell'applicazione Xcode e si completerà automaticamente in "NSString".digita "str" ​​e si completa automaticamente in "stringByAppendingString".Quindi le sequenze di tasti sono piuttosto limitate.

Una volta che hai imparato a premere il tasto "@" e a tabulare, il processo di scrittura del codice leggibile non diventa più un problema.È solo questione di adattarsi.

L'unico modo per rendere c = [a stringByAppendingString: b] qualsiasi più breve è quello di utilizzare il completamento automatico in tutto il st punto. L'operatore + fa parte di C, che non conosce sugli oggetti Objective-C.

Come su accorciando stringByAppendingString e utilizzare un #define :

#define and stringByAppendingString

In questo modo si può usare:

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

Il problema è che funziona solo per due stringhe, ti viene richiesto di avvolgere staffe aggiuntive Per ulteriori accodamento:

NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];
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];

Ho provato questo codice. ha funzionato per me.

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

Stava cercando il seguente nel riquadro lldb

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

quali errori.

invece usare alloc e initWithFormat metodo:

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

Questo è per una migliore registrazione e la registrazione solo - sulla base di dicius eccellente metodo di argomentazione multipla. Mi definisco una classe Logger, e lo chiamo in questo modo:

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

Quasi buono, tranne dover terminare args var con "zero", ma suppongo che non c'è modo intorno a quello 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 

Al fine di solo concat le stringhe, mi piacerebbe definire una categoria sulla NSString e aggiungi uno statico (+) metodo di concatenare in modo che appare esattamente come il metodo di registro di sopra, eccetto che restituisce la stringa. E 'su NSString perché è un metodo di stringa, ed è statica perché si vuole creare una nuova stringa dalle stringhe 1-N, non chiamare su uno qualsiasi delle stringhe che fanno parte del accodamento.

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

Prova stringWithFormat:

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

Quando si tratta di stringhe spesso trovo più facile per rendere il file sorgente objC ++, allora posso concatenare std :: stringhe utilizzando il secondo metodo indicato nella domanda.

std::string stdstr = [nsstr UTF8String];

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

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

Il mio metodo preferito è questo:

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

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

È possibile ottenere con l'aggiunta del metodo iscriverti per NSArray con una categoria:

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

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

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

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

È 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

è possibile utilizzare

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

Uno di questi formati lavorano in XCode7 quando ho provato:

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

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

Per qualche ragione, è necessario solo il carattere @ dell'operatore sulla prima corda del mix.

Tuttavia, non funziona con inserimento variabile. Per questo, è possibile utilizzare questa soluzione estremamente semplice con l'eccezione di utilizzando una macro sul "gatto" invece di "e" .

Per tutti gli amanti C Obiettivo che hanno bisogno di questo in un UI-test:

-(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];
}
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];

Nel Swift

let str1 = "This"
let str2 = "is just a test"

var appendStr1 = "\(str1) \(str2)" // appendStr1 would be "This is just a test"
var appendStr2 = str1 + str2 // // appendStr2 would be "This is just a test"

È inoltre possibile utilizzare += operatore per lo stesso, come di seguito ...

var str3 = "Some String" 
str3 += str2            // str3 would be "Some String is just a test"

Immaginiamo che u non so quante stringhe lì.

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:@", "];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top