2009-08-30 11 views
31

Hay un NSString método -characterAtIndex: que devuelve unichar.unichar y NSString: ¿qué tan intercambiables son estos?

  • (unichar) characterAtIndex: (NSUInteger) índice de

Me pregunto si esto unichar, lo que obviamente no es una NSString, se puede convertir en un NSString o alimentado a un NSString para ¿comparar propósitos?

Y: ¿un interior NSString solo consiste en una serie de elementos unichar?

Respuesta

63

Usted tiene dos opciones: la primera es una categoría añadiendo un método stringWithUnichar a NSString:

@interface NSString (MNNSStringWithUnichar) 
+ (NSString *) stringWithUnichar: (unichar) value; 
@end 


@implementation NSString (MNNSStringWithUnichar) 

+ (NSString *) stringWithUnichar:(unichar) value { 
    NSString *str = [NSString stringWithFormat: @"%C", value]; 
    return str; 
} 

@end 

A continuación, llame con

NSString *otherString = @"TestString"; 

NSString *str = [NSString stringWithUnichar:[otherString characterAtIndex:1]]; 

o usted podría ir directamente así:

NSString *str = [NSString stringWithFormat:@"%C",[otherString characterAtIndex:1]]; 

Elija la categoría si desea usarla repetidamente, o si solo tiene que hacerlo una vez , usa el ejemplo stringWithFormat !!

No estoy seguro de los detalles internos de NSString, pero supongo que probablemente es envolver un

unichar * 

o una matriz de unichars (como un char * C)

Un unichar es simplemente un valor de 16 bits que se usa para almacenar un personaje. A diferencia de un carácter sin signo que tiene solo 8 bits, puede contener más de 0-255, por lo que también puede contener caracteres unicode, que son 16 bits. Un NSString es un (grupo de) la clase [en] que contiene una matriz de unichars

EDIT

Éstos son algunos artículos sobre lo que las personas piensan que un NSString es:

http://cocoawithlove.com/2008/08/string-philosophies-char-arrays.html

http://www.reddit.com/r/programming/comments/6v1yw/string_philosophies_char_arrays_stdstring_and/

Espero que ayude!

+0

¿Olvidaste el @ antes de "TestString"? – newacct

+0

Sabía que algo no se veía bien ... ¡gracias! – micmoo

4

Otra opción es utilizar el método de la clase:

+ (id)stringWithCharacters:(const unichar *)characters length:(NSUInteger)length; 

lo tanto, sólo usando:

yourString = [NSString stringWithCharacters: &yourChar length: 1]; 

El parámetro yourChar debe ser un puntero.

2

NSString es realmente un clúster de clase.Eso significa que, por diversas razones, incluido el rendimiento basado en contenido y tamaño, y para admitir el puente gratuito a CFString cuando creas un NSString, en realidad puedes obtener una de muchas clases privadas que devuelven SÍ a isKindOf: cuando preguntas si es un NSString y responderá a todos los métodos en la clase NSString. Es como un protocolo, pero todos los objetos dicen y hacen y ser NSString en la API pública.

Como la documentación indica para NSString y CFString, conceptualmente es una matriz de UTF16 unichar Puede y utilizará una representación interna diferente donde presenta una ventaja para la implementación. Por lo general, el rendimiento a veces tamaño de memoria. Pero puede confiar en que le dará una matriz C de unichar cuando se le pida o cualquier otra cosa que la API prometa.

Ha tenido un largo tiempo para madurar y se ajusta internamente en casi todos los lanzamientos.

En resumen, sí, puede pensar que está respaldado por una matriz de UTF16 unichar que coincide en gran medida con la descripción de una cadena lógica en el estándar Unicode. Pero lo que hay que tener en cuenta es que no deberías preocuparte por lo que hay adentro, solo lo que te dice que está dentro.

Es una de las mejores implementaciones de Unicode. Si desea una imagen más completa de cómo funciona, puede ver (la mayoría) de la fuente de CFString en opensource.apple.com Es C y Core Foundation (orientado a objetos C) y bastante estilizado, así que no espere Comprende todo de una vez.

NSString y CFString tienen métodos para regresar y crear desde unichar. La mayoría de la gente no debería necesitarlos la mayor parte del tiempo. Si lo hace, tenga cuidado, prepárese para leer mucho y cometer errores ingenuos. Unicode es un gran tema. Manejarlo correctamente es una ciencia y un arte en ese nivel. Esa es una de las razones de NSString. Maneja muchas cosas difíciles para que no tengas que hacerlo tan a menudo, a menos que quieras o necesites hacerlo.

Cuestiones relacionadas