2011-07-05 14 views
10

Quiero dividir un NSString en un NSArray. Por ejemplo, dado:NSString a NSArray

NSString *[email protected]"ABCDEF"; 

quiero una NSArray como:

NSArray *myArray={A,B,C,D,E,F}; 

cómo hacer esto con Objective-C y Cocoa?

+6

¿Cómo desea para manejar los pares suplentes y caracteres compuestos de UTF-16 caracteres? – JeremyP

+3

debes aceptar una respuesta – Brenden

Respuesta

11
NSMutableArray *chars = [[NSMutableArray alloc] initWithCapacity:[theString length]]; 
for (int i=0; i < [theString length]; i++) { 
    NSString *ichar = [NSString stringWithFormat:@"%C", [theString characterAtIndex:i]]; 
    [chars addObject:ichar]; 
} 
+5

Esta es una solución ingenua que no maneja parejas sustitutas o personajes compuestos, como subraya astutamente @JeremyP en su comentario sobre la pregunta. Además, no olvide liberar la matriz cuando no esté usando GC o ARC. –

4

This link contiene ejemplos para dividir una cadena en una matriz basada en cadenas de sub y sobre la base de las cadenas en un conjunto de caracteres. Espero que la publicación te ayude.

Este es el código SNIP

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]; 
} 
+4

Considera mejorar tu publicación ya que tu respuesta es esencialmente un enlace. Ver: [¿Las respuestas que solo contienen enlaces en otros sitios son realmente "buenas respuestas"?] (Http://meta.stackexchange.com/q/8231/156620) y [¿Por qué los enlaces son malos?] (Http: //meta.stackexchange) .com/q/7515/156620) –

+0

@Bavarious, ¿Es eso suficiente? ;-) – EmptyStack

+1

@Bavarious de acuerdo, La respuesta que tiene solo un enlace no es más útil una vez que la URL se apaga. Así que ** EmptyStack ** por favor! Intente publicar algún código que pueda ayudar en el futuro para cualquier persona. ¡¡Gracias!! – swiftBoy

11

Conversión

NSString * string = @"A B C D E F"; 
NSArray * array = [string componentsSeparatedByString:@" "]; 
//Notice that in this case I separated the objects by a space because that's the way they are separated in the string 

registro

NSLog(@"%@", array); 

Console

Esto es lo que volvió la consola

+0

¿Qué tal esto, si tiene NSString * myString = @ "ABCDEF"; **sin espacio** ?? – swiftBoy

+0

Necesita algo para separarlo. –

+0

De lo contrario, podría usar un 'For Loop' y subscribir los caracteres en Strings. –

1

Sin bucle puede utilizar esto:

NSString *myString = @"ABCDEF"; 
NSMutableString *tempStr =[[NSMutableString alloc] initWithString:myString]; 

if([myString length] != 0) 
{ 
    NSError *error = NULL; 

    // declare regular expression object 
    NSRegularExpression *regex =[NSRegularExpression regularExpressionWithPattern:@"(.)" options:NSMatchingReportCompletion error:&error]; 

    // replace each match with matches character + <space> e.g. 'A' with 'A ' 
    [regex replaceMatchesInString:tempStr options:NSMatchingReportCompletion range:NSMakeRange(0,[myString length]) withTemplate:@"$0 "]; 

    // trim last <space> character 
    [tempStr replaceCharactersInRange:NSMakeRange([tempStr length] - 1, 1) withString:@""]; 

    // split into array 
    NSArray * arr = [tempStr componentsSeparatedByString:@" "]; 

    // print 
    NSLog(@"%@",arr); 
} 

Este espacio de agregación solución frente a cada personaje con la ayuda de la expresión regular y utiliza componentsSeparatedByString con <space> para devolver una matriz

22
NSMutableArray *letterArray = [NSMutableArray array]; 
NSString *letters = @"ABCDEFक्"; 
[letters enumerateSubstringsInRange:NSMakeRange(0, [letters length]) 
          options:(NSStringEnumerationByComposedCharacterSequences) 
         usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
    [letterArray addObject:substring]; 
}]; 

for (NSString *i in letterArray){ 
    NSLog(@"%@",i); 
} 

resultados en

A 
B 
C 
D 
E 
F 

क् 

enumerateSubstringsInRange:options:usingBlock: disponible para iOS 4+ pueden enumerar una cadena con diferentes estilos. Uno se llama NSStringEnumerationByComposedCharacterSequences, lo que va a enumerar letra por letra, pero es sensible a pares suplentes, personajes de base más marcas de combinación, Hangul Jamo, y grupos de consonantes Indic, todo referido como Compuesto Carácter

Tenga en cuenta, que el accepted answer "traga" y rompe क् en y .

+2

Definitivamente la forma correcta. Hice una categoría de esto: https://gist.github.com/4634479 – Berik

+0

En Swift esto ahora solo toma una línea. Ver https://stackoverflow.com/a/44675708/364446 – KPM

0

En Swift, esto se vuelve muy simple.

Swift 3:

myString.characters.map { String($0) } 

Swift 4:

myString.map { String($0) }