Класс NSString уже не раз довольно свободно использовался в примерах, приведенных ранее в этом разделе. Он является объектным вариантом представления символьной строки в среде Cocoa.

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

int х = 5;

NSString* s = @"widgets";

NSString* s2 = [NSString stringWithFormat:@"You have %d %@.M, x, s];

В классе NSString реализован современный, основанный на уникоде подход к содержимому символьной строки. Элементами такой строки являются символы, количество которых определяется свойством length, обозначающим длину строки. Символы строки не представлены байтами, поскольку числовое представление символа в уникоде может состоять из нескольких байтов в зависимости от конкретной кодировки. Они не являются также символическими знаками (так называемыми глифами), потому что последовательность составных символов, печатаемых как одна буква, может состоять из нескольких символов. Таким образом, длина диапазона типа NSRange, обозначающего один символ, может быть больше 1. Подробнее об этом можно узнать из главы “Characters and Grapheme Clusters” документации String Programming Guide, предоставляемой компанией Apple.

Поиск объектов типа NSString можно организовать с помощью различных методов типа rangeOf. . возвращающих структуру NSRange. Кроме того, класс NSScanner позволяет просмотреть всю символьную строку в поисках отдельных частей по определенному критерию. Например, с помощью класса NSScanner (а также класса NSCharacterSet) можно пропустить в символьной строке все, что предшествует числу, а затем извлечь это число. Семейство методов поиска rangeOf String: дает возможность находить подстроки. С помощью параметра NSRegularExpressionSearch можно организовать поиск, используя регулярное выражение. Регулярные выражения поддерживаются также в виде отдельного класса NSRegularExpression, в котором объект типа NSTextCheckingResult служит для описания совпавших результатов.

Ниже приведен пример кода, взятого из одного из моих приложений, где пользователь нажатием пальцем выбирает кнопку с надписью вроде 5 by 4 или 4 by 3. В данном примере нужно выяснить оба числа. Одно из них обозначает количество строк, а другое — количество столбцов, которое должно быть в компоновке. Для обнаружения обоих чисел в надписи используется класс NSScanner.

NSString* s = // надпись на кнопке, например, @"4 by 3м NSScanner* sc = [NSScanner scannerWithStringis]; int rows, cols;

[sc scanlnt:&rows];

[sc scanUpToCharactersFromSet:[decimalDigitCharacterSet] intoStringinil];

[sc scanlnt:&cols];

После выполнения этого кода требующиеся числа сохраняются в переменных rows и cols. Ниже показано, как то же самое можно сделать с помощью регулярного выражения.

NSString* s = // надпись на кнопке, например, @"4 by 3”

int rowcol[2];

int* prowcol = rowcol;

NSError* err = nil;

NSRegularExpression* r =

[NSRegularExpression regularExpressionWithPattern:0"\\d"

options:0

error:&err];

// проверка ошибок опущена

for (NSTextCheckingResult* match in

[r matchesInStringrs options:0 range:NSMakeRange(0, [s length])])

*prowcol++ = [[s substringWithRange: [match range]] intValue];

После выполнения этого кода требующиеся числа сохраняются в элементах массива rowcol [ 0 ] и rowcol [ 1 ]. В данном примере синтаксис выглядит слишком громоздким, поскольку каждое совпадение с регулярным выражением приходится преобразовывать сначала из объекта типа NSTextCheckingResult в диапазон, а затем в подстроку исходной символьной строки и, наконец, в целое значение.

Для поддержки более сложного анализа текста имеется ряд дополнительных классов, в том числе класс NSDataDetector, производный от класса NSRegularExpression и эффективно находящий определенные типы строковых выражений, например, URL или номер телефона, а также класс NSLinguisticTagger, фактически предпринимающий попытку проанализировать текст, разбивая его на грамматические части речи.

Символьная строка, представленная объектом типа NSString, считается неизменяемой. С помощью одной символьной строки можно сформировать разными способами другую строку, присоединив, например, к ней другую строку или выделив подстроку, но нельзя изменить саму символьную строку. Для этой цели потребуется подкласс NSMutableString, производный от класса NSString.

В классе NSString имеются служебные средства для работы с символьной строкой, содержащей путь к файлу. Этот класс нередко применяется вместе с NSURL — еще одним, также заслуживающим внимания классом из каркаса Foundation. В классе NSString и ряде других классов, рассматриваемых в этом разделе, предоставляются методы для ввода-вывода содержимого символьных строк в файл. При вызове этих методов файл может быть указан по пути в виде объекта типа NSString или URL в виде объекта типа NSURL.

Класс NSString не несет никакой информации о типе и размере шрифта. У интерфейсных объектов, отображающих символьные строки (например, класса UILabel), имеется свойство font, содержащее объект класса UIFont, но это свойство определяет только один тип и размер шрифта, которым будет отображаться символьная строка. До появления версии iOS 6 отображение оформленного стилями текста, разные фрагменты которого имели отличающие стилевые атрибуты (размер, тип, цвет шрифта и т.д.), было непростым делом. В классе NSAttributedString, представлявшем символьную строку со стилевым оформлением, требовалось использовать каркас Core Text и компоновать оформленный стилями текст, воспроизводя его вручную, поскольку такой текст нельзя было отобразить в любом стандартном интерфейсом объекте. Начиная с версии iOS 6, класс NSAttributedString стал полноценным классом языка Objective-C. Теперь у него имеются методы и вспомогательные классы, позволяющие легко создать самое изощренное стилевое оформление строк и целых абзацев текста, а встроенные интерфейсные объекты, предназначенные для воспроизведения текста, способны отображать оформленный стилями текст.

Воспроизведение символьных строк в графическом контексте может быть выполнено методами, предоставляемыми в категории NSStringDrawing из класса NSString (см. документацию NSString UIKit Additions Reference), а также в классе NSAttributedString (см. документацию NSAttributedString UIKit Additions Reference).


 

 

 

Добавить комментарий