Wie füge ich NSArray-Elemente zu einem NSString hinzu?


126

Gibt es bei einem NSArray von NSStrings eine schnelle Möglichkeit, sie zu einem einzigen NSString (mit einem Separator) zusammenzufügen?


Ich muss blind sein! oder müde. oder beides ...

2
Wenn Sie die NSString-Dokumente danach durchsuchen, werden Sie sie nie finden. Es ist in NSArray!
Boldad

Antworten:


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

Dies ist die Umkehrung von -[NSString componentsSeparatedByString:].



1

Es gibt auch diese Variante, wenn Ihr ursprüngliches Array Schlüsselwertobjekte enthält, aus denen Sie nur eine Eigenschaft auswählen möchten (die als Zeichenfolge serialisiert werden kann):

@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

In Ihrem Code ist ein Speicherverlust aufgetreten. MutableCopy behält das zu kopierende Objekt bei, daher müssten Sie am Ende [res autorelease] zurückgeben. Es gibt auch keinen Grund, Mutablecopy zu machen, anstatt einfach einen Mutablestring direkt von der Fledermaus zu machen.
Thewormsterror

@thewormsterror: Ich habe vergessen zu erwähnen, dass dieser Code für ARC war. Der Mutablecopy-Aufruf ist auch die moderne Objective-C-Konvention zum Erstellen einer veränderlichen Version von Objekten mit @ -syntax (z. B. [@ [] mutablecopy] für einen veränderlichen nsarray). Ich weiß nicht, was für einen Unterschied es in Bezug auf die Leistung macht.
Ben G
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.