Come unire elementi NSArray in una NSString?


126

Dato un NSArray di NSStrings, esiste un modo rapido per unirli in un singolo NSString (con un separatore)?


Devo essere cieco! o stanco. o entrambi ...

2
Se cerchi i documenti NSString per questo, non lo troverai mai. È in NSArray!
Colonia,

Risposte:


314
NSArray * stuff = /* ... */;
NSString * combinedStuff = [stuff componentsJoinedByString:@"separator"];

Questo è l'inverso di -[NSString componentsSeparatedByString:].



1

C'è anche questa variante, se l'array originale contiene oggetti valore-chiave da cui si desidera selezionare solo una proprietà (che può essere serializzata come stringa):

@implementation NSArray (itertools)

-(NSMutableString *)stringByJoiningOnProperty:(NSString *)property separator:(NSString *)separator
{
    NSMutableString *res = [@"" mutableCopy];
    BOOL firstTime = YES;
    for (NSObject *obj in self)
    {
        if (!firstTime) {
            [res appendString:separator];
        }
        else{
            firstTime = NO;
        }
        id val = [obj valueForKey:property];
        if ([val isKindOfClass:[NSString class]])
        {
            [res appendString:val];
        }
        else
        {
            [res appendString:[val stringValue]];
        }
    }
    return res;
}


@end

C'è una perdita di memoria nel tuo codice, mutableCopy mantiene l'oggetto che sta copiando, quindi dovresti restituire [res autorelease] alla fine. Inoltre, non vi è alcun motivo per fare la mutablecopy invece di fare semplicemente una mutablestring immediatamente.
thewormsterror

@thewormsterror: ho dimenticato di dire che questo codice era per ARC. Inoltre, la chiamata mutablecopy è la moderna convenzione obiettivo-c per la creazione di una versione mutabile degli oggetti usando @ -syntax (come [@ [] mutablecopy] per un nsarray mutabile). non so quale differenza renda le prestazioni sagge.
Ben G,
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.