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"


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow