Objective-C Language
NSString
Recherche…
Introduction
La classe NSString fait partie du framework Foundation pour travailler avec des chaînes (séries de caractères). Il comprend également des méthodes pour comparer, rechercher et modifier des chaînes.
Remarques
Pour imbriquer divers types d'objets et types de données dans NSStrings, reportez-vous à: Object-C, spécificateurs de format
Création
Simple:
NSString *newString = @"My String";
De plusieurs chaînes:
NSString *stringOne = @"Hello";
NSString *stringTwo = @"world";
NSString *newString = [NSString stringWithFormat:@"My message: %@ %@",
stringOne, stringTwo];
Utilisation de la chaîne Mutable
NSString *stringOne = @"Hello";
NSString *stringTwo = @"World";
NSMutableString *mutableString = [NSMutableString new];
[mutableString appendString:stringOne];
[mutableString appendString:stringTwo];
De NSData:
Lors de l'initialisation à partir de NSData
, un codage explicite doit être fourni car NSString
n'est pas en mesure de deviner comment les caractères sont représentés dans le flux de données brutes. L'encodage le plus courant de nos jours est UTF-8, qui est même une exigence pour certaines données telles que JSON.
Évitez d'utiliser +[NSString stringWithUTF8String:]
car il attend une chaîne C explicitement terminée par NULL, qui -[NSData bytes]
ne fournit pas .
NSString *newString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
De NSArray:
NSArray *myArray = [NSArray arrayWithObjects:@"Apple", @"Banana", @"Strawberry", @"Kiwi", nil];
NSString *newString = [myArray componentsJoinedByString:@" "];
Longueur de chaine
NSString a une propriété length
pour obtenir le nombre de caractères.
NSString *string = @"example";
NSUInteger length = string.length; // length equals 7
Comme dans l' exemple de fractionnement , gardez à l'esprit que NSString
utilise UTF-16 pour représenter les caractères. La longueur est en fait juste le nombre d'unités de code UTF-16. Cela peut différer de ce que l'utilisateur perçoit comme des personnages.
Voici quelques cas qui pourraient être surprenants:
@"é".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)
Pour obtenir le nombre de caractères perçus par l'utilisateur, appelés techniquement " grappes de graphèmes ", vous devez parcourir la chaîne avec -enumerateSubstringsInRange:options:usingBlock:
et conserver un compte. Ceci est démontré dans une réponse de Nikolai Ruhe sur Stack Overflow .
Changement de Cas
Pour convertir une chaîne en majuscule, utilisez la chaîne uppercaseString
:
NSString *myString = @"Emphasize this";
NSLog(@"%@", [myString uppercaseString]; // @"EMPHASIZE THIS"
Pour convertir une chaîne en minuscule, utilisez la chaîne lowercaseString
:
NSString *myString = @"NORMALIZE this";
NSLog(@"%@", [myString lowercaseString]; // @"normalize this"
Pour mettre en majuscule le premier caractère de chaque mot d'une chaîne, utilisez capitalizedString
:
NSString *myString = @"firstname lastname";
NSLog(@"%@", [myString capitalizedString]); // @"Firstname Lastname"
Comparaison de chaînes
Les chaînes sont comparées pour l'égalité en utilisant isEqualToString:
L'opérateur ==
teste simplement l'identité de l'objet et ne compare pas les valeurs logiques des objets, il ne peut donc pas être utilisé:
NSString *stringOne = @"example";
NSString *stringTwo = [stringOne mutableCopy];
BOOL objectsAreIdentical = (stringOne == stringTwo); // NO
BOOL stringsAreEqual = [stringOne isEqualToString:stringTwo]; // YES
L'expression (stringOne == stringTwo)
teste si les adresses mémoire des deux chaînes sont identiques, ce qui n'est généralement pas ce que nous voulons.
Si les variables de chaîne peuvent être nil
vous devez également prendre en compte ce cas:
BOOL equalValues = stringOne == stringTwo || [stringOne isEqualToString:stringTwo];
Cette condition renvoie YES
lorsque les chaînes ont des valeurs égales ou que les deux sont nil
.
Pour commander deux chaînes par ordre alphabétique, utilisez compare
NSComparisonResult result = [firstString compare:secondString];
NSComparisonResult
peut être:
-
NSOrderedAscending
: La première chaîne vient avant la deuxième chaîne. -
NSOrderedSame
: les chaînes sont égales. -
NSOrderedDescending
: la deuxième chaîne vient avant la première chaîne.
Pour comparer l’égalité entre deux chaînes, utilisez isEqualToString:
BOOL result = [firstString isEqualToString:secondString];
Pour comparer avec la chaîne vide ( @""
), mieux vaut utiliser la length
.
BOOL result = string.length == 0;
Rejoindre un tableau de chaînes
Pour combiner un NSArray
de NSString
dans un nouveau NSString
:
NSArray *yourWords = @[@"Objective-C", @"is", @"just", @"awesome"];
NSString *sentence = [yourWords componentsJoinedByString:@" "];
// Sentence is now: @"Objective-C is just awesome"
Encodage et décodage
// decode
NSString *string = [[NSString alloc] initWithData:utf8Data
encoding:NSUTF8StringEncoding];
// encode
NSData *utf8Data = [string dataUsingEncoding:NSUTF8StringEncoding];
Certains encodages supportés sont:
-
NSASCIIStringEncoding
-
NSUTF8StringEncoding
-
NSUTF16StringEncoding
(==NSUnicodeStringEncoding
)
Notez que utf8Data.bytes
n'inclut pas de caractère NULL utf8Data.bytes
, nécessaire pour les chaînes C. Si vous avez besoin d'une chaîne C, utilisez UTF8String
:
const char *cString = [string UTF8String];
printf("%s", cString);
Scission
Vous pouvez diviser une chaîne en un tableau de parties, divisé par un caractère séparateur .
NSString * yourString = @"Stack,Exchange,Network";
NSArray * yourWords = [yourString componentsSeparatedByString:@","];
// Output: @[@"Stack", @"Exchange", @"Network"]
Si vous devez diviser sur un ensemble de plusieurs délimiteurs différents , utilisez -[NSString componentsSeparatedByCharactersInSet:]
.
NSString * yourString = @"Stack Overflow+Documentation/Objective-C";
NSArray * yourWords = [yourString componentsSeparatedByCharactersInSet:
[NSCharacterSet characterSetWithCharactersInString:@"+/"]];
// Output: @[@"Stack Overflow", @"Documentation", @"Objective-C"]`
Si vous devez diviser une chaîne en caractères individuels , parcourez la longueur de la chaîne et convertissez chaque caractère en une nouvelle chaîne.
NSMutableArray * characters = [[NSMutableArray alloc] initWithCapacity:[yourString length]];
for (int i = 0; i < [myString length]; i++) {
[characters addObject: [NSString stringWithFormat:@"%C",
[yourString characterAtIndex:i]];
}
Comme dans l' exemple de longueur , gardez à l'esprit qu'un "caractère" est une unité de code UTF-16, pas nécessairement ce que l'utilisateur considère comme un caractère. Si vous utilisez cette boucle avec @"🇮🇹"
, vous verrez qu'elle est divisée en quatre parties.
Pour obtenir une liste des caractères perçus par l'utilisateur, utilisez -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];
}];
Cela préserve les grappes de graphèmes comme le drapeau italien en tant que sous-chaîne unique.
Recherche d'une sous-chaîne
Pour rechercher si une chaîne contient une sous-chaîne, procédez comme suit:
NSString *myString = @"This is for checking substrings";
NSString *subString = @"checking";
BOOL doesContainSubstring = [myString containsString:subString]; // YES
Si vous ciblez iOS 7 ou OS X 10.9 (ou antérieur):
BOOL doesContainSubstring = ([myString rangeOfString:subString].location != NSNotFound); // YES
Travailler avec des chaînes C
Pour convertir NSString
en const char
use -[NSString UTF8String]
:
NSString *myNSString = @"Some string";
const char *cString = [myNSString UTF8String];
Vous pouvez également utiliser -[NSString cStringUsingEncoding:]
si votre chaîne est codée avec autre chose que UTF-8.
Pour le chemin inverse, utilisez -[NSString stringWithUTF8String:]
:
const *char cString = "Some string";
NSString *myNSString = [NSString stringWithUTF8String:cString];
myNSString = @(cString); // Equivalent to the above.
Une fois que vous avez le caractère const char *
, vous pouvez l'utiliser avec un tableau de chars
:
printf("%c\n", cString[5]);
Si vous souhaitez modifier la chaîne, faites une copie:
char *cpy = calloc(strlen(cString)+1, 1);
strncpy(cpy, cString, strlen(cString));
// Do stuff with cpy
free(cpy);
Suppression d'espaces de début et de fin
NSString *someString = @" Objective-C Language \n";
NSString *trimmedString = [someString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//Output will be - "Objective-C Language"
La méthode stringByTrimmingCharactersInSet renvoie une nouvelle chaîne créée en supprimant des deux extrémités des caractères String contenus dans un jeu de caractères donné.
Nous pouvons également supprimer uniquement les espaces ou les lignes
// 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 "
Mise en forme
Le formatage NSString
prend en charge toutes les chaînes de format disponibles sur la fonction printf
ANSI-C. Le seul ajout apporté par le langage est le symbole %@
utilisé pour formater tous les objets Objective-C.
Il est possible de formater des entiers
int myAge = 21;
NSString *formattedAge = [NSString stringWithFormat:@"I am %d years old", my_age];
Ou tout objet sous-classé de NSObject
NSDate *now = [NSDate date];
NSString *formattedDate = [NSString stringWithFormat:@"The time right now is: %@", now];
Pour une liste complète des spécificateurs de format, voir: Objective-C, spécificateurs de format, syntaxe
Inverser un objectif NSString-C
// 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"