Suche…


Einführung

Die NSString- Klasse ist Teil des Foundation-Frameworks, um mit Zeichenfolgen (Reihe von Zeichen) zu arbeiten. Es enthält auch Methoden zum Vergleichen, Suchen und Ändern von Zeichenketten.

Bemerkungen

Informationen zum Schachteln verschiedener Objekttypen und Datentypen in NSStrings finden Sie unter: Objective-C, Formatbezeichner

Schaffung

Einfach:

NSString *newString = @"My String";

Von mehreren Strings:

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

Verwenden Sie einen veränderbaren String

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

Von NSData:

Beim Initialisieren von NSData muss eine explizite Codierung bereitgestellt werden, da NSString nicht erraten kann, wie Zeichen im Rohdatenstrom dargestellt werden. Die gebräuchlichste Kodierung ist heutzutage UTF-8, was sogar für bestimmte Daten wie JSON erforderlich ist.

Vermeiden Sie die Verwendung von +[NSString stringWithUTF8String:] da ein explizit NULL-terminierter C-String erwartet wird, den -[NSData bytes] nicht bereitstellen.

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

Von NSArray:

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

String-Länge

NSString verfügt über eine length Eigenschaft, um die Anzahl der Zeichen abzurufen.

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

NSString wie in dem Aufteilungsbeispiel , dass NSString zur Darstellung von Zeichen UTF-16 verwendet. Die Länge ist eigentlich nur die Anzahl der UTF-16-Codeeinheiten. Dies kann davon abweichen, was der Benutzer als Zeichen wahrnimmt.

Hier einige Fälle, die überraschend sein könnten:

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

Um die Anzahl der vom Benutzer wahrgenommenen Zeichen zu erhalten, die technisch als " Graphem-Cluster " bezeichnet werden, müssen Sie die Zeichenfolge mit -enumerateSubstringsInRange:options:usingBlock: und einen Zähler halten. Dies zeigt eine Antwort von Nikolai Ruhe auf Stack Overflow .

Fall ändern

Um einen String in Großbuchstaben zu konvertieren, verwenden Sie uppercaseString :

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

Um einen String in Kleinbuchstaben umzuwandeln, verwenden Sie lowercaseString :

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

Verwenden Sie die capitalizedString , um den ersten Buchstaben jedes Wortes in einer Zeichenfolge capitalizedString :

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

Zeichenfolgen vergleichen

Strings werden mit isEqualToString: auf Gleichheit isEqualToString:

Der Operator == prüft nur die Objektidentität und vergleicht die logischen Werte von Objekten nicht. Daher kann er nicht verwendet werden:

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

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

Der Ausdruck (stringOne == stringTwo) prüft, ob die Speicheradressen der beiden Zeichenfolgen identisch sind. (stringOne == stringTwo) ist normalerweise nicht das, was wir wollen.

Wenn die String-Variablen nil können, müssen Sie sich auch um diesen Fall kümmern:

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

Diese Bedingung gibt YES wenn Zeichenfolgen gleiche Werte haben oder beide gleich nil .

Um zwei Zeichenfolgen alphabetisch zu bestellen, verwenden Sie compare :.

NSComparisonResult result = [firstString compare:secondString];

NSComparisonResult kann sein:

  • NSOrderedAscending : Die erste Zeichenfolge steht vor der zweiten Zeichenfolge.
  • NSOrderedSame : Die Zeichenfolgen sind gleich.
  • NSOrderedDescending : Die zweite Zeichenfolge steht vor der ersten Zeichenfolge.

Verwenden Sie isEqualToString: um zwei Zeichenfolgengleichheit zu vergleichen isEqualToString:

BOOL result = [firstString isEqualToString:secondString];

Um mit der leeren Zeichenfolge ( @"" ) zu vergleichen, verwenden Sie die length besser.

BOOL result = string.length == 0;

Ein Array von Strings verbinden

So kombinieren Sie ein NSArray von NSString in ein neues NSString :

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

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

Kodierung und Dekodierung

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

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

Einige unterstützte Kodierungen sind:

  • NSASCIIStringEncoding
  • NSUTF8StringEncoding
  • NSUTF16StringEncoding (== NSUnicodeStringEncoding )

Beachten Sie, dass utf8Data.bytes kein abschließendes Nullzeichen enthält, das für C-Zeichenfolgen erforderlich ist. Wenn Sie einen C-String benötigen, verwenden Sie UTF8String :

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

Aufteilen

Sie können eine Zeichenfolge in ein Array von Teilen aufteilen, die durch ein Trennzeichen getrennt sind .

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

Wenn Sie mehrere verschiedene Trennzeichen -[NSString componentsSeparatedByCharactersInSet:] , verwenden Sie -[NSString componentsSeparatedByCharactersInSet:] .

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

Wenn Sie eine Zeichenfolge in einzelne Zeichen aufteilen müssen, müssen Sie die Länge der Zeichenfolge durchlaufen und jedes Zeichen in eine neue Zeichenfolge konvertieren.

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

Denken Sie daran, dass ein "Zeichen" wie in dem Längenbeispiel eine UTF-16-Codeeinheit ist und nicht unbedingt das, was der Benutzer als Zeichen sieht. Wenn Sie diese Schleife mit @"🇮🇹" , sehen Sie, dass sie in vier Teile aufgeteilt ist.

Um eine Liste der vom Benutzer wahrgenommenen Zeichen zu erhalten, verwenden Sie -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];
                            }];

Dadurch bleiben Graphem-Cluster wie die italienische Flagge als einzelne Teilzeichenfolge erhalten.

Suche nach einem Teilstring

Gehen Sie folgendermaßen vor, um zu suchen, ob ein String einen Teilstring enthält:

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

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

Wenn Sie auf iOS 7 oder OS X 10.9 (oder früher) abzielen:

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

Mit C-Strings arbeiten

Um NSString in const char zu konvertieren, verwenden Sie -[NSString UTF8String] :

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

Sie können auch -[NSString cStringUsingEncoding:] wenn Ihre Zeichenfolge mit einem anderen -[NSString cStringUsingEncoding:] als UTF-8 codiert ist.

Für den umgekehrten Pfad verwenden Sie -[NSString stringWithUTF8String:] :

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

Wenn Sie über das const char * verfügen, können Sie ähnlich wie ein Array von chars :

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

Wenn Sie die Zeichenfolge ändern möchten, erstellen Sie eine Kopie:

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

Entfernen von führenden und nachgestellten Leerzeichen

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

Die Methode stringByTrimmingCharactersInSet gibt eine neue Zeichenfolge zurück, die durch Entfernen der beiden Zeichenfolgen in einem bestimmten Zeichensatz von beiden Enden erstellt wird.

Wir können auch nur Whitespace oder Newline entfernen

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

Formatierung

Die NSString Formatierung unterstützt alle Formatstrings, die in der Funktion printf ANSI-C verfügbar sind. Die einzige hinzugefügte Sprache ist das Symbol %@ das zum Formatieren aller Objective-C-Objekte verwendet wird.

Es ist möglich, Ganzzahlen zu formatieren

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

Oder ein beliebiges Objekt, das von NSObject abgeleitet wurde

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

Eine vollständige Liste der Formatbezeichner finden Sie unter: Objective-C, Formatbezeichner, Syntax

NSString-Ziel-C rückgängig machen

// 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow