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"


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow