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

Cocoa

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

Основы форматирования

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

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

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

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

NSString *string1 = [NSString stringWithFormat:@"A string: %@, a float: %1.2f",

        @"string", 31415.9265];

// string1 содержит: "A string: string, a float: 31415.93"


NSNumber *number = [NSNumber numberWithInt:1234];

NSDictionary *dictionary = [NSDictionary dictionaryWithObject:[NSDate date]

        forKey:@"date"];

NSString *baseString = @"Base string.";

NSString *string2 = [baseString stringByAppendingFormat:

        @" A number: %@, a dictionary: %@", number, dictionary];

// string2 содержит: "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"];

Это не безопасно, т.к. включает высоко-битные символы в исходный код:

NSString *s = [NSString stringWithUTF8String:"Long — dash"];

NSString *s = @"Long — dash";    // Не допускается

NSLog и NSLogv

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

NSString *string = @"A contrived string %@";

NSLog(string);

// Приложение, вероятно, здесь закончится аварией из-за сигнала 10 (SIGBUS)

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

NSString *string = @"A contrived string %@";

NSLog(@"%@", string);

// Output: A contrived string %@
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac