Создание и преобразование строковых объектов

NSString и его подкласс NSMutableString обеспечьте несколько способов создать строковые объекты, самые основанные вокруг различных кодировок символов, которые это поддерживает. Несмотря на то, что строковые объекты всегда представляют свое собственное содержание как символы Unicode, они могут преобразовать свое содержание в и от многих других кодировок, таких как 7-разрядный ASCII, латынь ISO 1, EUC и Shift-JIS. availableStringEncodings метод класса возвращает поддерживаемые кодировки. Можно указать кодирование явно при преобразовании струны до в или от строкового объекта или использовать кодирование струны до по умолчанию, варьирующееся от платформы до платформы и возвращающееся defaultCStringEncoding метод класса.

Создание строк

Самый простой способ создать строковый объект в исходном коде состоит в том, чтобы использовать Objective C @"..." конструкция:

NSString *temp = @"Contrafibularity";

Отметьте при создании строковой константы этим способом, необходимо использовать символы UTF-8. Можно поместить фактические данные Unicode в строку для локализованного текста, как в NSString *hello = @"こんにちは";. Можно также вставить \u или \U в строке для неграфических символов.

Строковая константа Objective C создается во время компиляции и существует в течение выполнения Вашей программы. Компилятор делает такие объектные константы уникальными на основе на модуль, и они никогда не освобождаются. Можно также отправить сообщения непосредственно в строковую константу, поскольку Вы делаете любую другую строку:

BOOL same = [@"comparison" isEqualToString:myString];

NSString от струн до и данных

Создать NSString объект от струны до, Вы используете методы такой как initWithCString:encoding:. Необходимо правильно указать кодировку символов струны до. Похожие методы позволяют Вам создавать строковые объекты из символов во множестве кодировок. Метод initWithData:encoding: позволяет Вам преобразовывать строковые данные, хранившие в NSData объект в NSString объект.

char *utf8String = /* Assume this exists. */ ;
NSString *stringFromUTFString = [[NSString alloc] initWithUTF8String:utf8String];
 
char *macOSRomanEncodedString = /* assume this exists */ ;
NSString *stringFromMORString =
            [[NSString alloc] initWithCString:macOSRomanEncodedString
                              encoding:NSMacOSRomanStringEncoding];
 
NSData *shiftJISData =  /* assume this exists */ ;
NSString *stringFromShiftJISData =
            [[NSString alloc] initWithData:shiftJISData
                              encoding:NSShiftJISStringEncoding];

Следующий пример преобразовывает NSString объект, содержащий символ UTF-8 к данным ASCII тогда назад к NSString объект.

unichar ellipsis = 0x2026;
NSString *theString = [NSString stringWithFormat:@"To be continued%C", ellipsis];
 
NSData *asciiData = [theString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
 
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding];
 
NSLog(@"Original: %@ (length %d)", theString, [theString length]);
NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]);
 
// output:
// Original: To be continued… (length 16)
// Converted: To be continued... (length 18)

Переменные строки

Для создания переменной строки Вы обычно используете stringWithFormat:: или initWithFormat: (или для локализованных строк, localizedStringWithFormat:). Эти методы и их одноуровневые элементы используют строку формата в качестве шаблона, в который значения Вы обеспечиваете (строка и другие объекты, значения численных данных, и т.д.) вставляются. Они и спецификаторы поддерживаемого формата описаны в Форматировании Строковых Объектов.

Можно создать строку из существующих строковых объектов с помощью методов stringByAppendingString: и stringByAppendingFormat: создать новую строку путем добавления одной строки за другим, во втором случае с помощью строки формата.

NSString *hString = @"Hello";
NSString *hwString = [hString stringByAppendingString:@", world!"];

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

При создании строк для представления пользователю необходимо рассмотреть важность локализации приложения. В целом необходимо избежать создавать видимые пользователем строки непосредственно в коде. Вместо этого необходимо использовать строки в коде как ключ к словарю локализации, который предоставит видимую пользователем строку на предпочтительном языке пользователя. Обычно это включает использование NSLocalizedString и подобные макросы, как проиллюстрировано в следующем примере.

NSString *greeting = NSLocalizedStringFromTable
    (@"Hello", @"greeting to present in first launch panel", @"greetings");

Для больше об интернационализации Вашего приложения, посмотрите Руководство по Интернационализации и Локализации. Локализация Строковых ресурсов описывает, как работать с и переупорядочить аргументы переменной в локализованных строках.

Объединение и извлечение строк

Можно объединить и извлечь строки в различных способах. Самый простой способ объединить две строки состоит в том, чтобы добавить ту к другому. stringByAppendingString: метод возвращает строковый объект, сформированный из получателя и данного параметра.

NSString *beginning = @"beginning";
NSString *alphaAndOmega = [beginning stringByAppendingString:@" and end"];
// alphaAndOmega is @"beginning and end"

Можно также объединить несколько строк согласно шаблону с initWithFormat:, stringWithFormat:, и stringByAppendingFormat: методы; они описаны более подробно в Форматировании Строковых Объектов.

Можно извлечь подстроки с начала или конца строки к определенному индексу, или от определенного диапазона, с substringToIndex:, substringFromIndex:, и substringWithRange: методы. Можно также разделить строку на подстроки (на основе строки разделителя) с componentsSeparatedByString: метод. Эти методы проиллюстрированы в следующих примерах — замечают, что индекс основанных на индексе методов запускается в 0:

NSString *source = @"0123456789";
NSString *firstFour = [source substringToIndex:4];
// firstFour is @"0123"
 
NSString *allButFirstThree = [source substringFromIndex:3];
// allButFirstThree is @"3456789"
 
NSRange twoToSixRange = NSMakeRange(2, 4);
NSString *twoToSix = [source substringWithRange:twoToSixRange];
// twoToSix is @"2345"
 
NSArray *split = [source componentsSeparatedByString:@"45"];
// split contains { @"0123", @"6789" }

Если необходимо извлечь строки с помощью сопоставления с образцом, а не индекса, необходимо использовать сканер — посмотрите Сканеры.

Получение струн до

Для получения струны до от строкового объекта Рекомендуется использовать UTF8String. Это возвращает a const char * использование строкового кодирования UTF8.

const char *cString = [@"Hello, world" UTF8String];

Струна до, которую Вы получаете, принадлежит временному объекту и станет недопустимой, когда автоматическое освобождение имеет место. Если Вы хотите получить постоянную струну до, необходимо создать буфер и скопировать содержание const char * возвращенный методом.

Похожие методы позволяют Вам создавать строковые объекты из символов в кодировании Unicode или произвольном кодировании, и извлекать данные в этих кодировках. initWithData:encoding: и dataUsingEncoding: выполните эти преобразования от и до NSData объекты.

Сводка преобразования

Эта таблица суммирует наиболее распространенные средние значения создания и преобразования строковых объектов:

Источник

Метод создания

Метод экстракции

В коде

@"..." конструкция компилятора

N/A

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

stringWithUTF8String:

UTF8String

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

stringWithCharacters:length:

getCharacters:

getCharacters:range:

Произвольное кодирование

initWithData:encoding:

dataUsingEncoding:

Существующие строки

stringByAppendingString:

stringByAppendingFormat:

N/A

Строка формата

localizedStringWithFormat:

initWithFormat:locale:

Использовать NSScanner

Локализованные строки

NSLocalizedString и подобный

N/A