Objective-C Language                
            NSString
        
        
            
    Szukaj…
Wprowadzenie
Klasa NSString jest częścią frameworka Foundation do pracy z ciągami znaków (serią znaków). Zawiera również metody porównywania, wyszukiwania i modyfikowania ciągów.
Uwagi
Aby zagnieździć różne typy obiektów i typów danych w NSStrings, patrz: Objective-C, Specyfikatory formatu
kreacja
Prosty:
NSString *newString = @"My String";
Z wielu ciągów:
NSString *stringOne = @"Hello";
NSString *stringTwo = @"world";
NSString *newString = [NSString stringWithFormat:@"My message: %@ %@",
                     stringOne, stringTwo];
Używanie ciągu zmiennego
NSString *stringOne = @"Hello";
NSString *stringTwo = @"World";
NSMutableString *mutableString = [NSMutableString new];
[mutableString appendString:stringOne];
[mutableString appendString:stringTwo];
Z NSData:
 Podczas inicjowania z NSData należy podać jawne kodowanie, ponieważ NSString nie jest w stanie odgadnąć, w jaki sposób znaki są reprezentowane w surowym strumieniu danych. Najpopularniejszym obecnie kodowaniem jest UTF-8, który jest nawet wymagany w przypadku niektórych danych, takich jak JSON. 
 Unikaj używania +[NSString stringWithUTF8String:] ponieważ oczekuje jawnie zakończonego NULL łańcucha C, którego nie zapewnia -[NSData bytes] . 
NSString *newString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
Z NSArray:
NSArray *myArray = [NSArray arrayWithObjects:@"Apple", @"Banana", @"Strawberry", @"Kiwi", nil];
NSString *newString = [myArray componentsJoinedByString:@" "];
Długość łańcucha
 NSString ma właściwość length która pozwala uzyskać liczbę znaków. 
NSString *string = @"example";
NSUInteger length = string.length;       // length equals 7
 Podobnie jak w przykładzie podziału , pamiętaj, że NSString używa UTF-16 do reprezentowania znaków. Długość jest w rzeczywistości liczbą jednostek kodu UTF-16. Może się różnić od tego, co użytkownik postrzega jako postacie. 
Oto kilka przypadków, które mogą być zaskakujące:
@"é".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)
 Aby uzyskać liczbę znaków postrzeganych przez użytkownika, zwanych technicznie „ klastrami grafemów ”, należy iterować ciąg znaków z -enumerateSubstringsInRange:options:usingBlock: i zachować liczbę. Dowodzi tego odpowiedź Nikolai Ruhe na temat przepełnienia stosu . 
Changing Case
 Aby przekonwertować ciąg na wielkie litery, użyj uppercaseString : 
NSString *myString = @"Emphasize this";
NSLog(@"%@", [myString uppercaseString]; // @"EMPHASIZE THIS"
 Aby przekonwertować ciąg na małe litery, użyj lowercaseString : 
NSString *myString = @"NORMALIZE this";
NSLog(@"%@", [myString lowercaseString]; // @"normalize this"
 Aby wpisać wielką literę każdego słowa w ciągu, użyj capitalizedString : 
NSString *myString = @"firstname lastname";
NSLog(@"%@", [myString capitalizedString]); // @"Firstname Lastname"
Porównywanie ciągów
 Ciągi są porównywane pod kątem równości za pomocą isEqualToString: 
 Operator == sprawdza tylko tożsamość obiektu i nie porównuje wartości logicznych obiektów, więc nie można go użyć: 
NSString *stringOne = @"example";
NSString *stringTwo = [stringOne mutableCopy];
BOOL objectsAreIdentical = (stringOne == stringTwo);          // NO
BOOL stringsAreEqual = [stringOne isEqualToString:stringTwo]; // YES
 Wyrażenie (stringOne == stringTwo) sprawdza, czy adresy pamięci dwóch łańcuchów są takie same, co zwykle nie jest tym, czego chcemy. 
 Jeśli zmienne łańcuchowe mogą być nil , musisz również zadbać o ten przypadek: 
BOOL equalValues = stringOne == stringTwo || [stringOne isEqualToString:stringTwo];
 Ten warunek zwraca YES gdy łańcuchy mają równe wartości lub oba są nil . 
 Aby uporządkować dwa ciągi alfabetycznie, użyj compare 
NSComparisonResult result = [firstString compare:secondString];
 NSComparisonResult może być: 
-  NSOrderedAscending: Pierwszy ciąg występuje przed drugim ciągiem.
-  NSOrderedSame: Ciągi są równe.
-  NSOrderedDescending: Drugi ciąg znajduje się przed pierwszym ciągiem.
 Aby porównać równość dwóch ciągów, użyj isEqualToString: 
BOOL result = [firstString isEqualToString:secondString];
 Aby porównać z pustym ciągiem ( @"" ), lepiej użyj length . 
BOOL result = string.length == 0;
Dołączanie do szeregu ciągów
 Aby połączyć NSArray z NSString w nowy NSString : 
NSArray *yourWords = @[@"Objective-C", @"is", @"just", @"awesome"];
NSString *sentence = [yourWords componentsJoinedByString:@" "];
// Sentence is now: @"Objective-C is just awesome"
Kodowanie i dekodowanie
// decode
NSString *string = [[NSString alloc] initWithData:utf8Data
                                         encoding:NSUTF8StringEncoding];
// encode
NSData *utf8Data = [string dataUsingEncoding:NSUTF8StringEncoding];
Niektóre obsługiwane kodowania to:
-  NSASCIIStringEncoding
-  NSUTF8StringEncoding
-  NSUTF16StringEncoding(==NSUnicodeStringEncoding)
 Zauważ, że utf8Data.bytes nie zawiera kończącego znaku zerowego, który jest niezbędny dla łańcuchów C. Jeśli potrzebujesz łańcucha C, użyj UTF8String : 
const char *cString = [string UTF8String];
printf("%s", cString);
Rozdzielać
Możesz podzielić ciąg na tablicę części, podzieloną znakiem separatora .
NSString * yourString = @"Stack,Exchange,Network";
NSArray * yourWords = [yourString componentsSeparatedByString:@","]; 
// Output: @[@"Stack", @"Exchange", @"Network"]
 Jeśli chcesz podzielić na zestaw kilku różnych ograniczników , użyj -[NSString componentsSeparatedByCharactersInSet:] . 
NSString * yourString = @"Stack Overflow+Documentation/Objective-C";
NSArray * yourWords = [yourString componentsSeparatedByCharactersInSet:
                      [NSCharacterSet characterSetWithCharactersInString:@"+/"]];
// Output: @[@"Stack Overflow", @"Documentation", @"Objective-C"]`
Jeśli chcesz podzielić ciąg na poszczególne znaki , zapętlaj jego długość i konwertuj każdy znak na nowy.
NSMutableArray * characters = [[NSMutableArray alloc] initWithCapacity:[yourString length]];
for (int i = 0; i < [myString length]; i++) {
    [characters addObject: [NSString stringWithFormat:@"%C", 
                                      [yourString characterAtIndex:i]];
}
 Jak w Przykładzie długości , pamiętaj, że „znak” tutaj jest jednostką kodu UTF-16, niekoniecznie tym, co użytkownik widzi jako znak. Jeśli użyjesz tej pętli z @"🇮🇹" , zobaczysz, że jest ona podzielona na cztery części. 
 Aby uzyskać listę znaków postrzeganych przez użytkownika, użyj -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];
                            }];
Pozwala to zachować klastry grafemów, takie jak flaga Włoch, jako pojedynczy podciąg.
Wyszukiwanie podłańcucha
Aby wyszukać, czy ciąg zawiera podciąg, wykonaj następujące czynności:
NSString *myString = @"This is for checking substrings";
NSString *subString = @"checking"; 
BOOL doesContainSubstring = [myString containsString:subString];  // YES
W przypadku systemu iOS 7 lub OS X 10.9 (lub wcześniejszego):
BOOL doesContainSubstring = ([myString rangeOfString:subString].location != NSNotFound);  // YES
Praca z ciągami C.
 Aby przekonwertować NSString na const char użyj -[NSString UTF8String] : 
NSString *myNSString = @"Some string";
const char *cString = [myNSString UTF8String];
 Możesz także użyć -[NSString cStringUsingEncoding:] jeśli twój łańcuch jest zakodowany za pomocą czegoś innego niż UTF-8. 
 Do odwrotnej ścieżki użyj -[NSString stringWithUTF8String:] : 
const *char cString = "Some string";
NSString *myNSString = [NSString stringWithUTF8String:cString];
myNSString = @(cString); // Equivalent to the above.
 Gdy masz const char * , możesz z nim pracować podobnie do tablicy chars : 
printf("%c\n", cString[5]);
Jeśli chcesz zmodyfikować ciąg, wykonaj kopię:
char *cpy = calloc(strlen(cString)+1, 1);
strncpy(cpy, cString, strlen(cString));
// Do stuff with cpy
free(cpy);
Usuwanie wiodących i końcowych białych znaków
NSString *someString = @"   Objective-C Language  \n";
NSString *trimmedString = [someString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//Output will be - "Objective-C Language"
Metoda stringByTrimmingCharactersInSet zwraca nowy ciąg utworzony przez usunięcie z obu końców znaków String zawartych w danym zestawie znaków.
Możemy również usunąć tylko białe znaki lub nową linię
// 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  "
Formatowanie
 Formatowanie NSString obsługuje wszystkie ciągi formatujące dostępne w funkcji printf ANSI-C. Jedynym dodatkiem dokonanym przez język jest symbol %@ używany do formatowania wszystkich obiektów Objective-C. 
Możliwe jest formatowanie liczb całkowitych
int myAge = 21;
NSString *formattedAge = [NSString stringWithFormat:@"I am %d years old", my_age];
Lub dowolny obiekt podklasowany z NSObject
NSDate *now = [NSDate date];
NSString *formattedDate = [NSString stringWithFormat:@"The time right now is: %@", now];
Aby uzyskać pełną listę Specyfikatorów formatu, zobacz: Cel-C, Specyfikatory formatu, Składnia
Odwracanie NSString Objective-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"