Buscar..


Introducción

La clase NSString es una parte del marco de Foundation para trabajar con cadenas (series de caracteres). También incluye métodos para comparar, buscar y modificar cadenas.

Observaciones

Para anidar varios tipos de objetos y tipos de datos en NSStrings, consulte: Objective-C, Especificadores de formato

Creación

Sencillo:

NSString *newString = @"My String";

De múltiples cadenas:

NSString *stringOne = @"Hello";
NSString *stringTwo = @"world";
NSString *newString = [NSString stringWithFormat:@"My message: %@ %@",
                     stringOne, stringTwo];

Usando cadena mutable

NSString *stringOne = @"Hello";
NSString *stringTwo = @"World";
NSMutableString *mutableString = [NSMutableString new];
[mutableString appendString:stringOne];
[mutableString appendString:stringTwo];

De NSData:

Al inicializar desde NSData , se debe proporcionar una codificación explícita, ya que NSString no puede adivinar cómo se representan los caracteres en el flujo de datos sin procesar. La codificación más común hoy en día es UTF-8, que es incluso un requisito para ciertos datos como JSON.

Evite utilizar +[NSString stringWithUTF8String:] ya que espera una cadena C terminada explícitamente en NULL, que -[NSData bytes] no proporciona.

NSString *newString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

De NSArray:

NSArray *myArray = [NSArray arrayWithObjects:@"Apple", @"Banana", @"Strawberry", @"Kiwi", nil];
NSString *newString = [myArray componentsJoinedByString:@" "];

Longitud de la cuerda

NSString tiene una propiedad de length para obtener el número de caracteres.

NSString *string = @"example";
NSUInteger length = string.length;       // length equals 7

Como en el ejemplo de división , tenga en cuenta que NSString usa UTF-16 para representar caracteres. La longitud es en realidad sólo el número de unidades de código UTF-16. Esto puede diferir de lo que el usuario percibe como personajes.

Aquí hay algunos casos que pueden ser sorprendentes:

@"é".length == 1   // LATIN SMALL LETTER E WITH ACUTE (U+00E9)
@"é".length == 2   // LATIN SMALL LETTER E (U+0065) + COMBINING ACUTE ACCENT (U+0301)
@"❤️".length == 2  // HEAVY BLACK HEART (U+2764) + VARIATION SELECTOR-16 (U+FE0F)
@"🇮🇹".length == 4  // REGIONAL INDICATOR SYMBOL LETTER I (U+1F1EE) + REGIONAL INDICATOR SYMBOL LETTER T (U+1F1F9)

Para obtener el número de caracteres percibidos por el usuario, conocidos técnicamente como " agrupamientos de grafemas ", debe iterar sobre la cadena con -enumerateSubstringsInRange:options:usingBlock: y mantener un recuento. Esto se demuestra en una respuesta de Nikolai Ruhe en Stack Overflow .

Caso cambiante

Para convertir una cadena a mayúsculas, use uppercaseString :

NSString *myString = @"Emphasize this";
NSLog(@"%@", [myString uppercaseString]; // @"EMPHASIZE THIS"

Para convertir una cadena a minúsculas, use lowercaseString :

NSString *myString = @"NORMALIZE this";
NSLog(@"%@", [myString lowercaseString]; // @"normalize this"

Para poner en mayúscula el primer carácter de letra de cada palabra en una cadena, use capitalizedString :

NSString *myString = @"firstname lastname";
NSLog(@"%@", [myString capitalizedString]); // @"Firstname Lastname"

Comparando cuerdas

Las cadenas se comparan para la igualdad usando isEqualToString:

El operador == solo prueba la identidad del objeto y no compara los valores lógicos de los objetos, por lo que no se puede usar:

NSString *stringOne = @"example";
NSString *stringTwo = [stringOne mutableCopy];

BOOL objectsAreIdentical = (stringOne == stringTwo);          // NO
BOOL stringsAreEqual = [stringOne isEqualToString:stringTwo]; // YES

La expresión (stringOne == stringTwo) comprueba si las direcciones de memoria de las dos cadenas son iguales, lo que generalmente no es lo que queremos.

Si las variables de cadena pueden ser nil también debe tener cuidado con este caso:

BOOL equalValues = stringOne == stringTwo || [stringOne isEqualToString:stringTwo];

Esta condición devuelve YES cuando las cadenas tienen valores iguales o ambos son nil .

Para ordenar dos cadenas alfabéticamente, utilice compare :.

NSComparisonResult result = [firstString compare:secondString];

NSComparisonResult puede ser:

  • NSOrderedAscending : la primera cadena aparece antes de la segunda.
  • NSOrderedSame : Las cadenas son iguales.
  • NSOrderedDescending : la segunda cadena aparece antes de la primera.

Para comparar la igualdad de dos cadenas, use isEqualToString:

BOOL result = [firstString isEqualToString:secondString];

Para comparar con la cadena vacía ( @"" ), use mejor la length .

BOOL result = string.length == 0;

Unirse a una matriz de cuerdas

Para combinar una NSArray de NSString en una nueva NSString :

NSArray *yourWords = @[@"Objective-C", @"is", @"just", @"awesome"];
NSString *sentence = [yourWords componentsJoinedByString:@" "];

// Sentence is now: @"Objective-C is just awesome"

Codificación y decodificación

// decode
NSString *string = [[NSString alloc] initWithData:utf8Data
                                         encoding:NSUTF8StringEncoding];

// encode
NSData *utf8Data = [string dataUsingEncoding:NSUTF8StringEncoding];

Algunas codificaciones soportadas son:

  • NSASCIIStringEncoding
  • NSUTF8StringEncoding
  • NSUTF16StringEncoding (== NSUnicodeStringEncoding )

Tenga en cuenta que utf8Data.bytes no incluye un carácter nulo de terminación, que es necesario para las cadenas C. Si necesita una cadena en C, use UTF8String :

const char *cString = [string UTF8String];
printf("%s", cString);

Terrible

Puede dividir una cadena en una matriz de partes, dividida por un carácter separador .

NSString * yourString = @"Stack,Exchange,Network";
NSArray * yourWords = [yourString componentsSeparatedByString:@","]; 
// Output: @[@"Stack", @"Exchange", @"Network"]

Si necesita dividir en un conjunto de varios delimitadores diferentes , use -[NSString componentsSeparatedByCharactersInSet:] .

NSString * yourString = @"Stack Overflow+Documentation/Objective-C";
NSArray * yourWords = [yourString componentsSeparatedByCharactersInSet:
                      [NSCharacterSet characterSetWithCharactersInString:@"+/"]];
// Output: @[@"Stack Overflow", @"Documentation", @"Objective-C"]`

Si necesita dividir una cadena en sus caracteres individuales , recorra la longitud de la cadena y convierta cada carácter en una nueva cadena.

NSMutableArray * characters = [[NSMutableArray alloc] initWithCapacity:[yourString length]];
for (int i = 0; i < [myString length]; i++) {
    [characters addObject: [NSString stringWithFormat:@"%C", 
                                      [yourString characterAtIndex:i]];
}

Como en el Ejemplo de longitud , tenga en cuenta que un "carácter" aquí es una unidad de código UTF-16, no necesariamente lo que el usuario ve como un carácter. Si usa este bucle con @"🇮🇹" , verá que está dividido en cuatro partes.

Para obtener una lista de los caracteres percibidos por el usuario, use -enumerateSubstringsInRange:options:usingBlock:

NSMutableArray * characters = [NSMutableArray array];
[yourString enumerateSubstringsInRange:(NSRange){0, [yourString length]}
                               options:NSStringEnumerationByComposedCharacterSequences
                            usingBlock:^(NSString * substring, NSRange r, NSRange s, BOOL * b){
                                [characters addObject:substring];
                            }];

Esto conserva grupos de grafemas como la bandera italiana como una sola subcadena.

Buscando una subcadena

Para buscar si una cadena contiene una subcadena, haga lo siguiente:

NSString *myString = @"This is for checking substrings";
NSString *subString = @"checking"; 

BOOL doesContainSubstring = [myString containsString:subString];  // YES

Si se dirige a iOS 7 o OS X 10.9 (o anterior):

BOOL doesContainSubstring = ([myString rangeOfString:subString].location != NSNotFound);  // YES

Trabajar con cuerdas C

Para convertir NSString en uso de caracteres const char -[NSString UTF8String] :

NSString *myNSString = @"Some string";
const char *cString = [myNSString UTF8String];

También puede usar -[NSString cStringUsingEncoding:] si su cadena está codificada con algo distinto a UTF-8.

Para el uso de la ruta inversa -[NSString stringWithUTF8String:] :

const *char cString = "Some string";
NSString *myNSString = [NSString stringWithUTF8String:cString];
myNSString = @(cString); // Equivalent to the above.

Una vez que tenga el const char * , puede trabajar con él de manera similar a una serie de chars :

printf("%c\n", cString[5]);

Si desea modificar la cadena, haga una copia:

char *cpy = calloc(strlen(cString)+1, 1);
strncpy(cpy, cString, strlen(cString));
// Do stuff with cpy
free(cpy);

Eliminar espacios en blanco iniciales y finales

NSString *someString = @"   Objective-C Language  \n";
NSString *trimmedString = [someString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//Output will be - "Objective-C Language"

El método stringByTrimmingCharactersInSet devuelve una nueva cadena creada al eliminar de ambos extremos los caracteres de cadena contenidos en un conjunto de caracteres determinado.

También podemos eliminar solo espacios en blanco o nueva línea.

// Removing only WhiteSpace
NSString *trimmedWhiteSpace = [someString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
//Output will be - "Objective-C Language  \n"

// Removing only NewLine
NSString *trimmedNewLine = [someString stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
//Output will be - "   Objective-C Language  "

Formateo

El formato NSString admite todas las cadenas de formato disponibles en la printf ANSI-C de printf . La única adición hecha por el lenguaje es el símbolo %@ usado para formatear todos los objetos de Objective-C.

Es posible formatear enteros.

int myAge = 21;
NSString *formattedAge = [NSString stringWithFormat:@"I am %d years old", my_age];

O cualquier objeto subclasificado de NSObject

NSDate *now = [NSDate date];
NSString *formattedDate = [NSString stringWithFormat:@"The time right now is: %@", now];

Para obtener una lista completa de los Especificadores de formato, consulte: Objective-C, Especificadores de formato, Sintaxis

Invirtiendo un Objective-C de NSString

// myString is "hi"
NSMutableString *reversedString = [NSMutableString string];
NSInteger charIndex = [myString length];
while (charIndex > 0) {
    charIndex--;
    NSRange subStrRange = NSMakeRange(charIndex, 1);
    [reversedString appendString:[myString substringWithRange:subStrRange]];
}
NSLog(@"%@", reversedString); // outputs "ih"


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow