Sök…


Introduktion

Klassen NSString är en del av Foundation-ramverket för att arbeta med strängar (serier av tecken). Det innehåller också metoder för att jämföra, söka och ändra strängar.

Anmärkningar

För häckning av olika typer av objekt och datatyper i NSStrings hänvisas till: Objekt-C, Format Specifiers

Skapande

Enkel:

NSString *newString = @"My String";

Från flera strängar:

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

Använda Mutable String

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

Från NSData:

Vid initialisering från NSData måste en NSString kodning tillhandahållas eftersom NSString inte kan gissa hur tecken representeras i den råa dataströmmen. Den vanligaste kodningen idag är UTF-8, vilket till och med är ett krav för vissa data som JSON.

Undvik att använda +[NSString stringWithUTF8String:] eftersom den förväntar sig en uttryckligen NULL-avslutad C-sträng, som -[NSData bytes] inte ger.

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

Från NSArray:

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

Stränglängd

NSString har en length egendom för att få antalet tecken.

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

Liksom i delningsexemplet , kom ihåg att NSString använder UTF-16 för att representera tecken. Längden är faktiskt bara antalet UTF-16-kodenheter. Detta kan skilja sig från vad användaren uppfattar som tecken.

Här är några fall som kan vara överraskande:

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

För att få antalet användaruppfattade tecken, känt tekniskt som " grafeme kluster ", måste du iterera över strängen med -enumerateSubstringsInRange:options:usingBlock: och hålla en räkning. Detta visas i ett svar från Nikolai Ruhe på Stack Overflow .

Ändra fall

Om du vill konvertera en sträng till versaler använder du uppercaseString :

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

Om du vill konvertera en sträng till små bokstäver använder du lowercaseString :

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

Om du vill använda det första bokstäverna i varje ord i en sträng använder du capitalizedString sträng:

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

Jämför strängar

Strängar jämförs för jämlikhet med hjälp av isEqualToString:

Operatören == testar bara för objektidentitet och jämför inte de logiska värdena på objekt, så det kan inte användas:

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

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

Uttrycket (stringOne == stringTwo) testar för att se om minnesadresserna för de två strängarna är desamma, vilket vanligtvis inte är vad vi vill ha.

Om strängvariablerna kan vara nil måste du också ta hand om det här fallet:

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

Detta villkor returnerar YES när strängar har lika värden eller båda är nil .

För att beställa två strängar alfabetiskt använder du compare :.

NSComparisonResult result = [firstString compare:secondString];

NSComparisonResult kan vara:

  • NSOrderedAscending : Den första strängen kommer före den andra strängen.
  • NSOrderedSame : Strängarna är lika.
  • NSOrderedDescending : Den andra strängen kommer före den första strängen.

För att jämföra två strängar jämlikhet, använd isEqualToString:

BOOL result = [firstString isEqualToString:secondString];

För att jämföra med den tomma strängen ( @"" ), använd length bättre.

BOOL result = string.length == 0;

Gå med i en rad strängar

För att kombinera en NSArray av NSString till en ny NSString :

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

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

Kodning och avkodning

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

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

Vissa stödda kodningar är:

  • NSASCIIStringEncoding
  • NSUTF8StringEncoding
  • NSUTF16StringEncoding (== NSUnicodeStringEncoding )

Observera att utf8Data.bytes inte innehåller ett avslutande nolltecken, vilket är nödvändigt för C-strängar. Om du behöver en C-sträng använder du UTF8String :

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

delning

Du kan dela en sträng i en rad delar, dividerad med en separatortecken .

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

Om du behöver dela på en uppsättning av flera olika avgränsare använder du -[NSString componentsSeparatedByCharactersInSet:] .

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

Om du behöver bryta en sträng i dess enskilda tecken , slinga över strängens längd och konvertera varje tecken till en ny sträng.

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

Som i längdexemplet , kom ihåg att ett "tecken" här är en UTF-16-kodenhet, inte nödvändigtvis vad användaren ser som ett tecken. Om du använder den här slingan med @"🇮🇹" ser du att den är uppdelad i fyra delar.

För att få en lista över de tecken som användaren uppfattar, använd -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];
                            }];

Detta bevarar grafeme-kluster som den italienska flaggan som en enda substring.

Söker efter en underlag

Gör följande för att söka om en sträng innehåller en substring:

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

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

Om du är inriktad på iOS 7 eller OS X 10.9 (eller tidigare):

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

Arbeta med C-strängar

För att konvertera NSString till const char användning -[NSString UTF8String] :

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

Du kan också använda -[NSString cStringUsingEncoding:] om din sträng är kodad med något annat än UTF-8.

För -[NSString stringWithUTF8String:] :

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

När du har const char * kan du arbeta med det på samma sätt som en mängd chars :

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

Om du vill ändra strängen gör du en kopia:

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

Ta bort ledande och släpande mellanrum

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

MetodsträngByTrimmingCharactersInSet returnerar en ny sträng som skapas genom att ta bort från båda ändarna av strängtecken som finns i en given teckenuppsättning.

Vi kan också bara ta bort bara blanksteg eller ny linje

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

formatering

NSString formateringen stöder alla formatsträngar som finns tillgängliga på printf ANSI-C-funktionen. Det enda tillägget som görs av språket är %@ -symbolen som används för att formatera alla Objekt-C-objekt.

Det är möjligt att formatera heltal

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

Eller något objekt som underklassas från NSObject

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

För en komplett lista med formatspecifikationer, se: Objekt-C, Formatspecifikatorer, syntax

Omvända ett NSString-mål

// 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow