Konwertuj NSArray na NSString w Objective-C

Odpowiedzi:

534
NSString * result = [[array valueForKey:@"description"] componentsJoinedByString:@""];
Dave DeLong
źródło
1
Czy to nie osiągnie tego samego, co wywołanie [opis tablicy]?
TechZen
10
@TechZen - nie, ponieważ [array description]wstawia znaki nowej linii i zewnętrzne nawiasy.
Dave DeLong,
To powinna być wybrana odpowiedź!
pixelfreak
56
Po prostu chcesz się tutaj upewnić, ale czy jest NSString * myString = [array componentsJoinedByString:@""];to akceptowalnym substytutem?
Mick MacCallum
10
@ 0x7fffffff: Jest to równoważne, jeśli tablica zawiera tylko „podstawowe” typy. W przypadku typów złożonych będzie je oznaczać jako <ClassName: InstanceAddress>. valueForKeyCzyni go odzyskać określonej właściwości dla każdego elementu. W tym przypadku descriptionjest to NSString *właściwość NSObject, której getter można zastąpić podklasami.
jweyrich
32

Jednym podejściem byłoby iterowanie po tablicy, wywoływanie descriptionkomunikatu na każdym elemencie:

NSMutableString * result = [[NSMutableString alloc] init];
for (NSObject * obj in array)
{
    [result appendString:[obj description]];
}
NSLog(@"The concatenated string is %@", result);

Innym podejściem byłoby zrobienie czegoś w oparciu o klasę każdego przedmiotu:

NSMutableString * result = [[NSMutableString alloc] init];
for (NSObject * obj in array)
{
    if ([obj isKindOfClass:[NSNumber class]])
    {
        // append something
    }
    else
    {
        [result appendString:[obj description]];
    }
}
NSLog(@"The concatenated string is %@", result);

Jeśli chcesz przecinki i inne obce informacje, możesz po prostu:

NSString * result = [array description];
Jason
źródło
Jeśli tablica zawiera wiele elementów może być bardziej efektywne, aby najpierw przekonwertować wszystkie elementy do strun (prawdopodobnie za pomocą -description) i concat je po to korzystając -componentsJoinedByString:z @""jako parametr.
Georg Schölly,
Wybrałbym tę metodę zamiast metody Dave'a Delonga, chyba że tylko debugujesz.
TechZen
17

Myślę, że odpowiedź Sanjaya była już prawie na miejscu, ale użyłem jej w ten sposób

NSArray *myArray = [[NSArray alloc] initWithObjects:@"Hello",@"World", nil];
NSString *greeting = [myArray componentsJoinedByString:@" "];
NSLog(@"%@",greeting);

Wynik :

2015-01-25 08:47:14.830 StringTest[11639:394302] Hello World

Jak wskazał Sanjay - użyłem składników metodyJoinedByString z NSArray, która łączy się i zwraca NSString

BTW NSString ma metodę odwróconych składnikówSeparatedByString, która dokonuje podziału i zwraca NSArray .

Pranay
źródło
10

Niedawno znalazłem naprawdę dobry samouczek na temat ciągów Objective-C:

http://ios-blog.co.uk/tutorials/objective-c-strings-a-guide-for-beginners/

Pomyślałem, że może to być interesujące:

Jeśli chcesz podzielić ciąg na tablicę, użyj metody o nazwie componentsSeparatedByString, aby to osiągnąć:

NSString *yourString = @"This is a test string";
    NSArray *yourWords = [myString componentsSeparatedByString:@" "];

    // yourWords is now: [@"This", @"is", @"a", @"test", @"string"]

jeśli chcesz podzielić na zestaw kilku różnych znaków, użyj składników NSString'sSeparatedByCharactersInSet:

NSString *yourString = @"Foo-bar/iOS-Blog";
NSArray *yourWords = [myString componentsSeparatedByCharactersInSet:
                  [NSCharacterSet characterSetWithCharactersInString:@"-/"]
                ];

// yourWords is now: [@"Foo", @"bar", @"iOS", @"Blog"]

Należy jednak pamiętać, że ciąg separatora nie może być pusty. Jeśli chcesz oddzielić ciąg znaków do jego poszczególnych znaków, po prostu zapętl długość łańcucha i przekonwertuj każdy znak na nowy ciąg znaków:

NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[myString length]];
for (int i=0; i < [myString length]; i++) {
    NSString *ichar  = [NSString stringWithFormat:@"%c", [myString characterAtIndex:i]];
    [characters addObject:ichar];
}
MarkP
źródło
9
NSString * str = [componentsJoinedByString:@""];

i masz tablicę dic lub wiele, a następnie użyłeś poniżej

NSString * result = [[array valueForKey:@"description"] componentsJoinedByString:@""];   
Sanjay Kakadiya
źródło
1
NSArray *array = [NSArray arrayWithObjects:@"One",@"Two",@"Three", nil];
NSString *stringFromArray = [array componentsJoinedByString:@" "];

Pierwszy wiersz inicjuje tablicę z obiektami. Drugi wiersz łączy wszystkie elementy tej tablicy, dodając ciąg znaków wewnątrz „” i zwraca ciąg znaków.

AbdulAziz Rustam Ogli
źródło
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak ten kod odpowiada na pytanie, poprawia jego długoterminową wartość.
Kaczor Donald
Dziękuję za radę, szczerze!
AbdulAziz Rustam Ogli
1

Cel C Rozwiązanie

NSArray * array = @[@"1", @"2", @"3"];
NSString * stringFromArray = [[array valueForKey:@"description"] componentsJoinedByString:@"-"];   // "1-2-3"

Ci, którzy szukają rozwiązania w Swift

Jeśli tablica zawiera ciągi, możesz użyć metody łączenia ciągu:

var array = ["1", "2", "3"]

let stringFromArray = "-".join(array) // "1-2-3"

W Swift 2:

var array = ["1", "2", "3"]

let stringFromArray = array.joinWithSeparator("-") // "1-2-3"

W Swift 3 i 4

var array = ["1", "2", "3"]

let stringFromArray = array.joined(separator: "-") // "1-2-3"
Asad Ali Choudhry
źródło
-1

To, co wiem, jest łatwe.

var NSArray_variable = NSArray_Object[n]
var stringVarible = NSArray_variable as String

nto wewnętrzna pozycja w tablicy This in SWIFT Language. Może działać w celu C

jasmo2
źródło
-1

Rozwiązanie Swift 3.0:

let string = array.joined(separator: " ")
AhmedZah
źródło