Objective-C Language
NSString
Zoeken…
Invoering
De klasse NSString maakt deel uit van het Foundation-framework om met tekenreeksen (reeks tekens) te werken. Het bevat ook methoden voor het vergelijken, zoeken en wijzigen van tekenreeksen.
Opmerkingen
Voor het nesten van verschillende soorten objecten en gegevenstypen in NSStrings raadpleegt u: Objective-C, opmaakspecificaties
schepping
Gemakkelijk:
NSString *newString = @"My String";
Uit meerdere reeksen:
NSString *stringOne = @"Hello";
NSString *stringTwo = @"world";
NSString *newString = [NSString stringWithFormat:@"My message: %@ %@",
stringOne, stringTwo];
Mutable String gebruiken
NSString *stringOne = @"Hello";
NSString *stringTwo = @"World";
NSMutableString *mutableString = [NSMutableString new];
[mutableString appendString:stringOne];
[mutableString appendString:stringTwo];
Van NSData:
Bij initialisatie vanuit NSData
moet een expliciete codering worden opgegeven, omdat NSString
niet kan raden hoe tekens worden weergegeven in de onbewerkte gegevensstroom. De meest voorkomende codering tegenwoordig is UTF-8, wat zelfs een vereiste is voor bepaalde gegevens zoals JSON.
Vermijd het gebruik van +[NSString stringWithUTF8String:]
omdat het een expliciet NULL-beëindigde C-string verwacht, die -[NSData bytes]
niet biedt.
NSString *newString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
Van NSArray:
NSArray *myArray = [NSArray arrayWithObjects:@"Apple", @"Banana", @"Strawberry", @"Kiwi", nil];
NSString *newString = [myArray componentsJoinedByString:@" "];
Draadlengte
NSString heeft een length
eigenschap om het aantal tekens te krijgen.
NSString *string = @"example";
NSUInteger length = string.length; // length equals 7
Net als in het splitsingsvoorbeeld , houd er rekening mee dat NSString
UTF-16 gebruikt om tekens weer te geven. De lengte is eigenlijk alleen het aantal UTF-16 code-eenheden. Dit kan verschillen van wat de gebruiker als tekens waarneemt.
Hier zijn enkele gevallen die verrassend kunnen zijn:
@"é".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)
Om het aantal door de gebruiker waargenomen tekens te krijgen, technisch bekend als " grapheme clusters ", moet u de string -enumerateSubstringsInRange:options:usingBlock:
met -enumerateSubstringsInRange:options:usingBlock:
en houd een telling bij. Dit wordt aangetoond in een antwoord van Nikolai Ruhe op Stack Overflow .
Veranderen van zaak
Gebruik uppercaseString
om een tekenreeks naar hoofdletters te converteren:
NSString *myString = @"Emphasize this";
NSLog(@"%@", [myString uppercaseString]; // @"EMPHASIZE THIS"
Om een tekenreeks naar kleine letters te converteren, gebruikt u lowercaseString
:
NSString *myString = @"NORMALIZE this";
NSLog(@"%@", [myString lowercaseString]; // @"normalize this"
Om de eerste letter karakter van elk woord kapitaliseren in een string, gebruik capitalizedString
:
NSString *myString = @"firstname lastname";
NSLog(@"%@", [myString capitalizedString]); // @"Firstname Lastname"
Strings vergelijken
Strings worden vergeleken voor gelijkheid met isEqualToString:
De operator ==
test alleen op objectidentiteit en vergelijkt de logische waarden van objecten niet, dus deze kan niet worden gebruikt:
NSString *stringOne = @"example";
NSString *stringTwo = [stringOne mutableCopy];
BOOL objectsAreIdentical = (stringOne == stringTwo); // NO
BOOL stringsAreEqual = [stringOne isEqualToString:stringTwo]; // YES
De expressie (stringOne == stringTwo)
test om te zien of de geheugenadressen van de twee strings hetzelfde zijn, wat meestal niet is wat we willen.
Als de tekenreeksvariabelen nil
kunnen zijn, moet u ook voor dit geval zorgen:
BOOL equalValues = stringOne == stringTwo || [stringOne isEqualToString:stringTwo];
Deze voorwaarde retourneert YES
als tekenreeksen gelijke waarden hebben of beide nil
.
Gebruik compare
: om twee reeksen alfabetisch te bestellen.
NSComparisonResult result = [firstString compare:secondString];
NSComparisonResult
kan zijn:
-
NSOrderedAscending
: de eerste string komt vóór de tweede string. -
NSOrderedSame
: De tekenreeksen zijn gelijk. -
NSOrderedDescending
: de tweede reeks komt vóór de eerste reeks.
Gebruik isEqualToString:
gelijkheid van twee strings te vergelijken.
BOOL result = [firstString isEqualToString:secondString];
Gebruik length
om de vergelijking met de lege string ( @""
) te vergelijken.
BOOL result = string.length == 0;
Deelnemen aan een Array of Strings
Een NSArray
van NSString
combineren in een nieuwe NSString
:
NSArray *yourWords = @[@"Objective-C", @"is", @"just", @"awesome"];
NSString *sentence = [yourWords componentsJoinedByString:@" "];
// Sentence is now: @"Objective-C is just awesome"
Codering en decodering
// decode
NSString *string = [[NSString alloc] initWithData:utf8Data
encoding:NSUTF8StringEncoding];
// encode
NSData *utf8Data = [string dataUsingEncoding:NSUTF8StringEncoding];
Enkele ondersteunde coderingen zijn:
-
NSASCIIStringEncoding
-
NSUTF8StringEncoding
-
NSUTF16StringEncoding
(==NSUnicodeStringEncoding
)
Merk op dat utf8Data.bytes
geen afsluitend null-teken bevat, wat nodig is voor C-reeksen. Gebruik UTF8String
als u een C-string nodig UTF8String
:
const char *cString = [string UTF8String];
printf("%s", cString);
Splitsen
U kunt een string splitsen in een reeks onderdelen, gescheiden door een scheidingsteken .
NSString * yourString = @"Stack,Exchange,Network";
NSArray * yourWords = [yourString componentsSeparatedByString:@","];
// Output: @[@"Stack", @"Exchange", @"Network"]
Als u een reeks verschillende scheidingstekens moet splitsen, gebruikt u -[NSString componentsSeparatedByCharactersInSet:]
.
NSString * yourString = @"Stack Overflow+Documentation/Objective-C";
NSArray * yourWords = [yourString componentsSeparatedByCharactersInSet:
[NSCharacterSet characterSetWithCharactersInString:@"+/"]];
// Output: @[@"Stack Overflow", @"Documentation", @"Objective-C"]`
Als je een string in zijn afzonderlijke tekens moet opsplitsen, loop je over de lengte van de string en converteer je elk karakter in een nieuwe string.
NSMutableArray * characters = [[NSMutableArray alloc] initWithCapacity:[yourString length]];
for (int i = 0; i < [myString length]; i++) {
[characters addObject: [NSString stringWithFormat:@"%C",
[yourString characterAtIndex:i]];
}
Zoals in het lengtevoorbeeld , houd er rekening mee dat een "karakter" hier een UTF-16 code-eenheid is, niet noodzakelijkerwijs wat de gebruiker als een karakter ziet. Als je deze lus gebruikt met @"🇮🇹"
, zul je zien dat deze in vier stukken is verdeeld.
Om een lijst met door de gebruiker waargenomen tekens te krijgen, gebruikt u -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];
}];
Dit behoudt grafeme clusters zoals de Italiaanse vlag als een enkele substring.
Zoeken naar een substring
Ga als volgt te werk om te zoeken of een tekenreeks een substring bevat:
NSString *myString = @"This is for checking substrings";
NSString *subString = @"checking";
BOOL doesContainSubstring = [myString containsString:subString]; // YES
Als u iOS 7 of OS X 10.9 (of eerder) target:
BOOL doesContainSubstring = ([myString rangeOfString:subString].location != NSNotFound); // YES
Werken met C Strings
Om NSString
te converteren naar const char
gebruik -[NSString UTF8String]
:
NSString *myNSString = @"Some string";
const char *cString = [myNSString UTF8String];
U kunt ook -[NSString cStringUsingEncoding:]
als uw string is gecodeerd met iets anders dan UTF-8.
Gebruik voor het omgekeerde pad -[NSString stringWithUTF8String:]
:
const *char cString = "Some string";
NSString *myNSString = [NSString stringWithUTF8String:cString];
myNSString = @(cString); // Equivalent to the above.
Als je eenmaal de const char *
, kun je ermee werken op dezelfde manier als een reeks chars
:
printf("%c\n", cString[5]);
Als u de tekenreeks wilt wijzigen, maakt u een kopie:
char *cpy = calloc(strlen(cString)+1, 1);
strncpy(cpy, cString, strlen(cString));
// Do stuff with cpy
free(cpy);
Voorloop- en volgspaties verwijderen
NSString *someString = @" Objective-C Language \n";
NSString *trimmedString = [someString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//Output will be - "Objective-C Language"
Methode stringByTrimmingCharactersInSet retourneert een nieuwe string gemaakt door aan beide uiteinden van de String-tekens in een bepaalde tekenset te verwijderen.
We kunnen ook alleen alleen witruimte of nieuwe regel verwijderen
// 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 "
formatteren
De NSString
opmaak ondersteunt alle opmaakreeksen die beschikbaar zijn op de printf
ANSI-C-functie. De enige toevoeging van de taal is het %@
-symbool dat wordt gebruikt voor het opmaken van alle Objective-C-objecten.
Het is mogelijk om gehele getallen op te maken
int myAge = 21;
NSString *formattedAge = [NSString stringWithFormat:@"I am %d years old", my_age];
Of elk object dat is onderverdeeld in NSObject
NSDate *now = [NSDate date];
NSString *formattedDate = [NSString stringWithFormat:@"The time right now is: %@", now];
Zie voor een volledige lijst met opmaakspecificaties: Objective-C, opmaakspecificaties, syntaxis
Omkeren van een NSString doelstelling-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"