Поиск…


Вступление

Класс NSString является частью фреймворка Foundation для работы со строками (серия символов). Он также включает методы для сравнения, поиска и изменения строк.

замечания

Для вложения различных типов объектов и типов данных в NSStrings относятся: Objective-C, Спецификаторы формата

Создание

Просто:

NSString *newString = @"My String";

Из нескольких строк:

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

Использование Mutable String

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

Из NSData:

При инициализации из NSData должно быть предусмотрено явное кодирование, поскольку NSString не может угадать, как символы представлены в потоке необработанных данных. В настоящее время наиболее распространенной кодировкой является UTF-8, что даже является требованием для определенных данных, таких как JSON.

Избегайте использования +[NSString stringWithUTF8String:] поскольку он ожидает явно C-строку с завершающим действием NULL, которая -[NSData bytes] не предоставляет.

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

Из NSArray:

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

Длина строки

NSString имеет свойство length чтобы получить количество символов.

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

Как и в примере разделения , имейте в виду, что NSString использует UTF-16 для представления символов. Длина на самом деле равна количеству кодовых единиц UTF-16. Это может отличаться от того, что пользователь воспринимает как символы.

Вот некоторые примеры, которые могут удивить:

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

Чтобы получить количество воспринимаемых пользователем символов, известных технически как « кластеры графемы », вы должны перебирать строку с помощью -enumerateSubstringsInRange:options:usingBlock: и сохранить счет. Об этом свидетельствует ответ Николая Рухе о переполнении стека .

Смена случая

Чтобы преобразовать строку в верхний регистр, используйте uppercaseString :

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

Чтобы преобразовать строку в нижний регистр, используйте lowercaseString :

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

Чтобы загладить первый буквенный символ каждого слова в строке, используйте capitalizedString :

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

Сравнение строк

Строки сравниваются для равенства с использованием isEqualToString:

Оператор == просто проверяет идентификатор объекта и не сравнивает логические значения объектов, поэтому его нельзя использовать:

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

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

Выражение (stringOne == stringTwo) проверяет, (stringOne == stringTwo) ли адреса памяти двух строк, что обычно не является тем, что мы хотим.

Если строковые переменные могут быть nil вам также нужно позаботиться об этом случае:

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

Это условие возвращает YES когда строки имеют одинаковые значения или оба значения равны nil .

Чтобы заказать две строки в алфавитном порядке, используйте compare :.

NSComparisonResult result = [firstString compare:secondString];

NSComparisonResult может быть:

  • NSOrderedAscending : первая строка появляется перед второй строкой.
  • NSOrderedSame : строки равны.
  • NSOrderedDescending : вторая строка предшествует первой строке.

Чтобы сравнить равенство двух строк, используйте isEqualToString:

BOOL result = [firstString isEqualToString:secondString];

Для сравнения с пустой строкой ( @"" ) лучше использовать length .

BOOL result = string.length == 0;

Присоединение к массиву строк

Чтобы объединить NSArray NSString в новый NSString :

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

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

Кодирование и декодирование

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

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

Некоторые поддерживаемые кодировки:

  • NSASCIIStringEncoding
  • NSUTF8StringEncoding
  • NSUTF16StringEncoding (== NSUnicodeStringEncoding )

Обратите внимание, что utf8Data.bytes не содержит завершающий нулевой символ, который необходим для строк C. Если вам нужна строка C, используйте UTF8String :

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

расщепляющий

Вы можете разбить строку на массив частей, разделенный символом разделителя .

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

Если вам нужно разбить на несколько разных разделителей , используйте -[NSString componentsSeparatedByCharactersInSet:] .

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

Если вам нужно разбить строку на отдельные символы , проведите цикл по длине строки и преобразуйте каждый символ в новую строку.

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

Как и в примере длины , имейте в виду, что «символ» здесь - это код кода UTF-16, не обязательно тот, который пользователь видит в качестве символа. Если вы используете этот цикл с @"🇮🇹" , вы увидите, что он разделен на четыре части.

Чтобы получить список воспринимаемых пользователем символов, используйте -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];
                            }];

Это сохраняет кластеры grapheme как итальянский флаг как единую подстроку.

Поиск подстроки

Чтобы выполнить поиск, если строка содержит подстроку, выполните следующие действия:

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

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

Если таргетинг на iOS 7 или OS X 10.9 (или ранее):

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

Работа с C-строками

Для преобразования NSString в использование const char -[NSString UTF8String] :

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

Вы также можете использовать -[NSString cStringUsingEncoding:] если ваша строка закодирована чем-то иным, чем UTF-8.

Для использования обратного пути -[NSString stringWithUTF8String:] :

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

Когда у вас есть const char * , вы можете работать с ним аналогично массиву chars :

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

Если вы хотите изменить строку, сделайте копию:

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

Удаление ведущего и перемещающегося пробелов

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

Метод stringByTrimmingCharactersInSet возвращает новую строку, выполненную путем удаления с обоих концов символов String, содержащихся в заданном наборе символов.

Мы также можем просто удалить только пробел или новую строку

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

форматирование

Форматирование NSString поддерживает все строки формата, доступные в printf ANSI-C printf . Единственным дополнением, сделанным языком, является символ %@ используемый для форматирования всех объектов Objective-C.

Можно отформатировать целые числа

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

Или любой объект, подклассифицированный из NSObject

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

Полный список спецификаторов формата см. В разделе: Objective-C, Спецификаторы формата, Синтаксис

Реверсирование задачи NSString-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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow