Jak dołączyć elementy NSArray do NSString?


126

Biorąc pod uwagę NSArray of NSStrings, czy istnieje szybki sposób połączenia ich w jeden NSString (z separatorem)?


Muszę być ślepy! lub zmęczony. lub oba ...

2
Jeśli przeszukasz dokumentację NSString, nigdy tego nie znajdziesz. Jest w NSArray!
bolnad

Odpowiedzi:


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

To jest odwrotność -[NSString componentsSeparatedByString:].



1

Istnieje również ten wariant, jeśli oryginalna tablica zawiera obiekty klucz-wartość, z których chcesz wybrać tylko jedną właściwość (którą można serializować jako ciąg):

@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

W twoim kodzie występuje przeciek pamięci, mutableCopy zachowuje kopiowany obiekt, dlatego na końcu musisz zwrócić [res autorelease]. Nie ma też powodu, aby robić mutablekopy zamiast po prostu zrobić mutablestring prosto z nietoperza.
thewormsterror

@thewormsterror: zapomniałem wspomnieć, że ten kod jest przeznaczony dla ARC. Ponadto wywołanie mutablecopy jest nowoczesną konwencją Objective-c do tworzenia mutowalnych wersji obiektów przy użyciu @ -syntax (na przykład [@ [] mutablecopy] dla mutowalnej tablicy nsarray). Nie wiem, jaka różnica sprawia, że ​​wydajność jest mądra.
Ben G,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.