Ricerca…


introduzione

La classe NSString fa parte del framework Foundation per lavorare con le stringhe (serie di caratteri). Include anche metodi per confrontare, cercare e modificare le stringhe.

Osservazioni

Per annidare vari tipi di oggetti e tipi di dati in NSStrings, fare riferimento a: Objective-C, Format Specifiers

Creazione

Semplice:

NSString *newString = @"My String";

Da più stringhe:

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

Utilizzando la stringa mutabile

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

Da NSData:

Durante l'inizializzazione da NSData , è necessario fornire una codifica esplicita poiché NSString non è in grado di indovinare il modo in cui i caratteri sono rappresentati nel flusso di dati non elaborati. La codifica più comune al giorno d'oggi è UTF-8, che è anche un requisito per alcuni dati come JSON.

Evitare di usare +[NSString stringWithUTF8String:] poiché si aspetta una C-stringa esplicitamente con NULL, che -[NSData bytes] non fornisce.

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

Da NSArray:

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

Lunghezza della stringa

NSString ha una proprietà length per ottenere il numero di caratteri.

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

Come nell'esempio di divisione , tieni presente che NSString utilizza UTF-16 per rappresentare i caratteri. La lunghezza è in realtà solo il numero di unità di codice UTF-16. Questo può differire da ciò che l'utente percepisce come caratteri.

Ecco alcuni casi che potrebbero sorprendere:

@"é".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)

Per ottenere il numero di caratteri percepiti dall'utente, tecnicamente noti come " grapheme cluster ", è necessario eseguire un'iterazione sulla stringa con -enumerateSubstringsInRange:options:usingBlock: e mantenere un conteggio. Ciò è dimostrato in una risposta di Nikolai Ruhe su Stack Overflow .

Caso cambiante

Per convertire una stringa in maiuscolo, utilizzare uppercaseString :

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

Per convertire una stringa in lettere minuscole, utilizzare la stringa lowercaseString :

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

Per scrivere in maiuscolo il carattere della prima lettera di ogni parola in una stringa, usa capitalizedString :

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

Confronto di stringhe

Le stringhe vengono confrontate per l'uguaglianza usando isEqualToString:

L'operatore == verifica solo l'identità dell'oggetto e non confronta i valori logici degli oggetti, quindi non può essere utilizzato:

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

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

L'espressione (stringOne == stringTwo) verifica se gli indirizzi di memoria delle due stringhe sono uguali, che di solito non è quello che vogliamo.

Se le variabili di stringa possono essere nil devi preoccuparti anche di questo caso:

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

Questa condizione restituisce YES quando le stringhe hanno valori uguali o entrambi sono nil .

Per ordinare due stringhe in ordine alfabetico, usa compare :.

NSComparisonResult result = [firstString compare:secondString];

NSComparisonResult può essere:

  • NSOrderedAscending : la prima stringa arriva prima della seconda stringa.
  • NSOrderedSame : le stringhe sono uguali.
  • NSOrderedDescending : la seconda stringa arriva prima della prima stringa.

Per confrontare l'uguaglianza di due stringhe, utilizzare isEqualToString:

BOOL result = [firstString isEqualToString:secondString];

Per confrontare con la stringa vuota ( @"" ), utilizzare meglio la length .

BOOL result = string.length == 0;

Partecipare a una serie di stringhe

Per combinare un NSArray di NSString in una nuova NSString :

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

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

Codifica e decodifica

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

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

Alcune codifiche supportate sono:

  • NSASCIIStringEncoding
  • NSUTF8StringEncoding
  • NSUTF16StringEncoding (== NSUnicodeStringEncoding )

Si noti che utf8Data.bytes non include un carattere null terminante, che è necessario per le stringhe C. Se hai bisogno di una stringa C, usa UTF8String :

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

scissione

È possibile dividere una stringa in un array di parti, diviso per un carattere separatore .

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

Se è necessario dividere un insieme di diversi delimitatori , utilizzare -[NSString componentsSeparatedByCharactersInSet:] .

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

Se hai bisogno di rompere una stringa nei suoi singoli caratteri , fai un loop sulla lunghezza della stringa e converti ciascun carattere in una nuova stringa.

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

Come nell'esempio di lunghezza , tieni presente che un "carattere" qui è un'unità di codice UTF-16, non necessariamente ciò che l'utente vede come un personaggio. Se usi questo ciclo con @"🇮🇹" , vedrai che è diviso in quattro parti.

Per ottenere un elenco dei caratteri percepiti dall'utente, utilizzare -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];
                            }];

Ciò preserva grapheme grappoli come la bandiera italiana come una singola sottostringa.

Ricerca di una sottostringa

Per cercare se una stringa contiene una sottostringa, effettuare le seguenti operazioni:

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

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

Se scegli come target iOS 7 o OS X 10.9 (o versioni precedenti):

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

Lavorare con le stringhe C.

Per convertire NSString in uso const char -[NSString UTF8String] :

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

Puoi anche usare -[NSString cStringUsingEncoding:] se la tua stringa è codificata con qualcosa di diverso da UTF-8.

Per il percorso inverso utilizzare -[NSString stringWithUTF8String:] :

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

Una volta ottenuto il const char * , è possibile utilizzarlo in modo simile a un array di chars :

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

Se vuoi modificare la stringa, fai una copia:

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

Rimozione degli spazi bianchi iniziali e finali

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

Metodo stringByTrimmingCharactersInSet restituisce una nuova stringa creata rimuovendo da entrambe le estremità dei caratteri String contenuti in un determinato set di caratteri.

Possiamo anche rimuovere solo spazi bianchi o newline

// 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  "

formattazione

La formattazione NSString supporta tutte le stringhe di formato disponibili sulla printf ANSI-C di printf . L'unica aggiunta apportata dalla lingua è il simbolo %@ utilizzato per la formattazione di tutti gli oggetti Objective-C.

È possibile formattare numeri interi

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

O qualsiasi oggetto sottoclassato da NSObject

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

Per un elenco completo degli specificatori di formato, vedere: Objective-C, Format Specifiers, Sintassi

Inversione di un obiettivo 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow