Форматирование строковых объектов

Эта статья описывает, как создать строку с помощью строки формата, как использовать символы неASCII в строке формата и распространенную ошибку, при использовании которой делают разработчики NSLog или NSLogv.

Форматирование основ

NSString использует строку формата, синтаксис которой подобен используемому другими объектами средства форматирования. Это поддерживает символы формата, определенные для функции ANSI C printf(), плюс %@ для любого объекта (см. Спецификаторы Формата строки и IEEE printf спецификация). Если объект отвечает на descriptionWithLocale: сообщения, NSString отправляет такое сообщение для получения текстового представления. Иначе, это отправляет a description сообщение. Локализация Строковых ресурсов описывает, как работать с и переупорядочить аргументы переменной в локализованных строках.

В строках формата,‘%’символ объявляет о заполнителе для значения с символами, следующими за определением ожидаемого вида имеющего значение и как отформатировать его. Например, строка формата "%d houses" ожидает, что целочисленное значение будет заменено выражение формата'%d'. NSString поддерживает символы формата, определенные для функции ANSI Cprintf(), плюс‘@’для любого объекта. Если объект отвечает на descriptionWithLocale: сообщение, NSString отправляет то сообщение для получения текстового представления, иначе, это отправляет a description сообщение.

Форматирование значения затронуто текущей локалью пользователя, которая является NSDictionary объект, указывающий число, дату и другие виды форматов. NSString использование только определение локали для десятичного разделителя (данный ключом назван NSDecimalSeparator). Если Вы используете метод, не указывающий локаль, строка принимает локаль по умолчанию.

Можно использовать NSString stringWithFormat: метод и другие связанные методы для создания строк с printf- разработайте спецификаторы формата и списки аргументов, как описано в Создании и Преобразовании Строковых Объектов. Примеры ниже иллюстрируют, как можно создать строку с помощью множества спецификаторов формата и параметров.

NSString *string1 = [NSString stringWithFormat:@"A string: %@, a float: %1.2f",
                                               @"string", 31415.9265];
// string1 is "A string: string, a float: 31415.93"
 
NSNumber *number = @1234;
NSDictionary *dictionary = @{@"date": [NSDate date]};
NSString *baseString = @"Base string.";
NSString *string2 = [baseString stringByAppendingFormat:
        @" A number: %@, a dictionary: %@", number, dictionary];
// string2 is "Base string. A number: 1234, a dictionary: {date = 2005-10-17 09:02:01 -0700; }"

Строки и символы неASCII

Можно включать символы неASCII (включая Unicode) в строковых методах использования такой как stringWithFormat: и stringWithUTF8String:.

NSString *s = [NSString stringWithFormat:@"Long %C dash", 0x2014];

С тех пор \xe2\x80\x94 3-байтовая строка UTF-8 для 0x2014, Вы могли также записать:

NSString *s = [NSString stringWithUTF8String:"Long \xe2\x80\x94   dash"];

NSLog и NSLogv

Служебные функции NSLog() и NSLogv() используйте NSString строковые службы форматирования для журналирования сообщений об ошибках. Обратите внимание на то, что в результате этого, необходимо заботиться при указании параметра за эти функции. Частая ошибка состоит в том, чтобы указать строку, включающую символы форматирования, как показано в следующем примере.

NSString *string = @"A contrived string %@";
NSLog(string);
// The application will probably crash here due to signal 10 (SIGBUS)

Лучше (более безопасно) использовать строку формата для вывода другой строки, как показано в следующем примере.

NSString *string = @"A contrived string %@";
NSLog(@"%@", string);
// Output: A contrived string %@