Objective-C Language
NSString
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"