Comment joindre des éléments NSArray dans une NSString?

126

Étant donné un NSArray de NSStrings, existe-t-il un moyen rapide de les joindre en une seule NSString (avec un séparateur)?


la source
Je dois être aveugle! ou fatigué. ou les deux ...
2
Si vous recherchez cela dans la documentation NSString, vous ne le trouverez jamais. C'est dans NSArray!
bolnad le

Réponses:

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

C'est l'inverse de -[NSString componentsSeparatedByString:].

Dave DeLong
la source
1

Il existe également cette variante, si votre tableau d'origine contient des objets clé-valeur à partir desquels vous ne souhaitez sélectionner qu'une propriété (qui peut être sérialisée sous forme de chaîne):

@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
Ben G
la source
Il y a une fuite de mémoire dans votre code, mutableCopy conserve l'objet qu'il est en train de copier, vous devrez donc renvoyer [res autorelease] à la fin. De plus, il n'y a aucune raison de faire une copie mutablecopy au lieu de simplement créer une chaîne mutablestring dès le départ.
thewormsterror
@thewormsterror: j'ai oublié de mentionner que ce code était pour ARC. En outre, l'appel mutablecopy est la convention objective-c moderne pour créer une version mutable d'objets utilisant @ -syntax (comme [@ [] mutablecopy] pour un nsarray mutable). Je ne sais pas quelle différence cela fait en termes de performances.
Ben G