Наборы символов
NSCharacterSet
объект представляет ряд символов Unicode. NSString
и NSScanner
использование объектов NSCharacterSet
объекты собрать в группу символы для поиска операций, так, чтобы они могли найти любой определенный набор символов во время поиска.
Основы набора символов
Объект набора символов представляет ряд символов Unicode. Наборы символов представлены экземплярами кластера класса. Два общедоступных класса кластера, NSCharacterSet
и NSMutableCharacterSet
, объявите программируемый интерфейс для неизменных и непостоянных наборов символов, соответственно. Неизменный набор символов определяется, когда он создается и впоследствии не может быть изменен. Непостоянный набор символов может быть изменен после того, как он будет создаваться.
Объект набора символов не выполняет задач; это просто содержит ряд символьных значений для ограничения операций на строках. NSString
и NSScanner
классы определяют берущие методы NSCharacterSet
объекты как параметры для нахождения любого из нескольких символов. Например, эта выборка кода находит диапазон первой прописной буквы в myString:
.
NSString *myString = @"some text in an NSString..."; |
NSCharacterSet *characterSet = [NSCharacterSet uppercaseLetterCharacterSet]; |
NSRange letterRange = [myString rangeOfCharacterFromSet:characterSet]; |
После того, как этот фрагмент выполняется, letterRange.location
равно индексу первого «N» в «NSString» после rangeOfCharacterFromSet:
вызывается. Если первая буква строки была «S», то letterRange.location
был бы 0
.
Создание наборов символов
NSCharacterSet
определяет методы класса, возвращающие обычно используемые наборы символов, такие как буквы (верхний регистр или нижний регистр), десятичные цифры, пробел, и т.д. Эти «стандартные» наборы символов являются всегда неизменными, даже если создаваемый путем отправки сообщения в NSMutableCharacterSet
. Посмотрите Наборы Стандартного символа и Определения Unicode для получения дополнительной информации о наборах стандартного символа.
Можно использовать набор стандартного символа в качестве начальной точки для создания пользовательского набора путем создания непостоянной копии из него и изменения этого. (Можно также запустить с нуля путем создания непостоянного набора символов с alloc
и init
и добавление символов к нему.), Например, этот фрагмент создает набор символов, содержащий буквы, цифры и основную пунктуацию:
NSMutableCharacterSet *workingSet = [[NSCharacterSet alphanumericCharacterSet] mutableCopy]; |
[workingSet addCharactersInString:@";:,."]; |
NSCharacterSet *finalCharacterSet = [workingSet copy]; |
Для определения пользовательского набора символов с помощью кодовых точек Unicode используйте код, подобный следующему фрагменту (который создает набор символов включая символы перевода страницы и символы разделителя строк):
UniChar chars[] = {0x000C, 0x2028}; |
NSString *string = [[NSString alloc] initWithCharacters:chars |
length:sizeof(chars) / sizeof(UniChar)]; |
NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:string]; |
Соображения производительности
Поскольку наборы символов часто участвуют в критическом по отношению к производительности коде, необходимо знать об аспектах их использования, которое может влиять на производительность приложения. Непостоянные наборы символов являются обычно намного более дорогими, чем неизменные наборы символов. Они используют больше памяти и являются дорогостоящими для инвертирования (работа, часто выполняемая в сканировании строки). Из-за этого необходимо следовать этим инструкциям:
Создайте как можно меньше непостоянных наборов символов.
Наборы символов кэша (в глобальном словаре, возможно) вместо того, чтобы постоянно воссоздать их.
При создании пользовательского набора, который не должен изменяться после создания, сделайте неизменную копию набора последнего символа для фактического использования и избавьтесь от рабочего непостоянного набора символов. Также создайте файл набора символов, как описано в Создании файла набора символов и сохраните его в основном пакете своего приложения.
Точно так же избегите архивировать объекты набора символов; сохраните их в файлах набора символов вместо этого. Архивация может привести к набору символов, дублируемому в различных архивных файлах, приводящих к потраченному впустую дисковому пространству и копии в памяти для каждого отдельного архивного чтения.
Создание файла набора символов
Если Ваше приложение часто использует пользовательский набор символов, необходимо сохранить его определение в файле ресурсов и загрузке, что вместо того, чтобы явно добавить отдельные символы каждый раз необходимо создать набор. Можно сохранить набор символов путем получения его растрового представления ( NSData
объект) и сохранение, которые возражают против файла:
NSData *charSetRep = [finalCharacterSet bitmapRepresentation]; |
NSURL *dataURL = <#URL for character set#>; |
NSError *error; |
BOOL result = [charSetRep writeToURL:dataURL options:NSDataWritingAtomic error:&error]; |
Условно, имена файлов набора символов используют расширение .bitmap
. Если Вы намереваетесь для других использовать свои файлы набора символов, необходимо следовать этому соглашению. Считать файл набора символов с a .bitmap
расширение, просто используйте characterSetWithContentsOfFile:
метод.
Наборы стандартного символа и определения Unicode
Наборы стандартного символа, такие как возвращенный letterCharacterSet
, формально определяются с точки зрения нормативных и информативных категорий, установленных стандартом Unicode, таких как Прописная буква, Комбинируя Знак, и т.д. Формальное определение набора стандартного символа в большинстве случаев дано как один или больше категорий, определенных в стандарте. Например, набор, возвращенный lowercaseLetterCharacterSet
включайте все символы в нормативные Строчные буквы категории, в то время как набор, возвращенный letterCharacterSet
включает символы во все категории Буквы.
Обратите внимание на то, что определения самих категорий могут измениться с новыми версиями стандарта Unicode. Можно загрузить файлы, определяющие членство в категории от http://www .unicode.org/.