Como unir elementos do NSArray em um NSString?


126

Dado um NSArray de NSStrings, existe uma maneira rápida de juntá-los em um único NSString (com um Separador)?


Eu devo ser cego! ou cansado. ou ambos ...

2
Se você pesquisar os documentos do NSString para isso, nunca o encontrará. Está no NSArray!
22123 bolnad

Respostas:


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

Este é o inverso de -[NSString componentsSeparatedByString:].



1

Há também essa variante, se sua matriz original contiver objetos Key-Value a partir dos quais você deseja escolher apenas uma propriedade (que pode ser serializada como uma string):

@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

Há um vazamento de memória no seu código, mutableCopy retém o objeto que está copiando, portanto, você precisará retornar [res autorelease] no final. Além disso, não há razão para fazer uma cópia mutável em vez de apenas fazer uma sequência mutável logo de cara.
precisa saber é o seguinte

@thewormsterror: esqueceu de mencionar que este código era para o ARC. Além disso, a chamada mutablecopy é a convenção objetiva-c moderna para criar versão mutável de objetos usando a sintaxe @ (como [@ [] mutablecopy] para um nsarray mutável). não sei que diferença faz o desempenho ser sábio.
Ben G
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.