Objective-C Language
NSString
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"