355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Стивен Кочан » Программирование на Objective-C 2.0 » Текст книги (страница 18)
Программирование на Objective-C 2.0
  • Текст добавлен: 19 сентября 2016, 13:02

Текст книги "Программирование на Objective-C 2.0"


Автор книги: Стивен Кочан



сообщить о нарушении

Текущая страница: 18 (всего у книги 32 страниц)

Часть II. Foundation Framefork Глава 14. Введение в Foundation Framework

Фреймворк (framework) – это набор классов, методов, функций и документации, логически сгруппированных для упрощения разработки программ. В системе Mac OS X имеется более 80 фрей м ворков для разработки приложений. Они позволяют упростить работу со структурой Mac Address Book, выполнять запись на CD, воспроизведение DVD, воспроизведение фильмов с помощью QuickTime, воспроизведение музыки и т.д.

Фреймворк, который является базой для разработки программ, называется Foundation framework. Этот фреймворк, (он является темой второй части книги) позволяет работать с базовыми объектами, такими как числа и строки, а также с коллекциями объектов, такими как массивы, словари и наборы (множества). Имеются также средства для работы с датой и временем, автоматического управления памятью, работы с базовыми файловыми системами, сохранения (или архивации) объектов, а также для работы с геометрическими структурами данных, такими как точки (point) и прямоугольники (rectangle).

Фреймворк Application Kit содержит обширный набор классов и методов для разработки интерактивных графических приложений. Они позволяют легко работать с текстами, меню, панелями инструментов, таблицами, документами, компоновочными буферами (pasteboard) и окнами. В Mac OS X термин Cocoa означает совместное использование фреймворков Foundation framework и Application Kit framework. Термин Cocoa Touch означает совместное использование фреймворков Foundation framework и UIKit framework. Эта тема описывается в части III настоящей книги. Многие источники информации приводятся в приложении D. Документация Foundation

Для справки мы приводим местонахождение заголовочных файлов (.h) Foundation. Это папка /System/Library/Frameworks/Foundation.framework/Headers

Перейдите в эту папку на своем компьютере и ознакомьтесь с ее содержимым. Обратитесь также к документации Foundation framework, которая хранится па вашем компьютере (в подпапках папки /Developer/Doeumentation) и доступна на веб-сайте Apple. Большинство документации доступно в форме НТМ L-файлов для просмотра браузером или pdf-файлов Acrobat. В ней содержится описание всех классов Foundation и всех реализованных методов и функций.

Если вы используете Xcode для разработки своих программ, то имеете простой доступ к этой документации через окно Documentation, которое вызывается с помощью меню Help Xcode. Из этого окна можно легко выполнять поиск и осуществлять доступ к документации, которая хранится локально на вашем компьютере или доступна в Интернет. На рис. 14.1 показаны результаты поиска строки «foundation framework» в окне документации Xcode. Из панели под заголовком «Foundation Framework Reference» (Справка по Foundation Framework) вы можете легко выполнять доступ к документации по всем классам Foundation.

Рис. 14.1. Доступа к справочной документации Foundation из Xcode

Если вы редактируете файл в Xcode и хотите получить непосредственный доступ к документации по определенному заголовочному файлу, методу или классу, достаточно выделить этот текст в окне редактора и щелкнуть на нем правой кнопкой. В появившемся меню можно выбрать Find Selected Text in Documentation (Найти выбранный текст в документации) или Find Selected Text in API Reference (Найти выбранный текст в справке API). Xcode найдет нужную библиотеку документации и выведет результат в соответствии с вашим запросом.

Класс NSString – это класс Foundation, который используется для работы со строками. (Его описание см. в следующей главе.) Предположим, что вы редак-тируете программу, в которой используется этот класс, и вам нужно получить информацию о нем и его методах. Нужно выделить слово NSString в любом месте окна редактирования и щелкнуть на нем правой кнопкой. Если выбрать в по-явившемся меню пункт Find Selected Text in API Reference, появится окно до-кумента (рис. I4.2).

Рис. 14.2. Получение документации по классу NSString

Выполняя прокрутку панели под заголовком NSString Class Reference (Справка но классу NSString), вы увидите (среди прочей информации) список всех методов, которые поддерживаются этим классом. Это позволяет легко находить информацию о методах, реализуемых определенным классом, включая описание их работы и аргументов, которые они принимают.

К этой документации можно также выполнять доступ по адресу deveIoper.apple.com/referencelibrary с переходом к справочной документации Foundation (по ссылкам Cocoa, Frameworks, Foundation Framework Reference). На этом веб-сайте можно найти разнообразные документы по определенным вопросам программирования, таким как управление памятью, строки и управление файлами.

Если вы не подписаны на определенный набор документов вместе с Xcode, то оилайн-документация может быть более свежей, чем на вашем диске.

На этом заканчивается краткое введение в Foundation framework. Теперь мы переходим к изучению некоторых классов этого фреймворка и способам их включения в ваши приложения.

Глава 15. Числа, строки и коллекции

В этой главе описывается работа с некоторыми базовыми объектами в Foundation framework. Это числа, строки и коллекции, позволяющие работать с группами объектов в форме массивов, словарей и наборов.

Foundation framework содержит множество классов, методов и функций. В Mac OS X доступны примерно 125 заголовочных (.h) файлов. Для доступа к ним используйте следующий оператор импорта. #import

Файл Foundation.h импортирует практически все другие заголовочные файлы Foundation. Xcode автоматически вставляет этот заголовочный файл в вашу программу, как во всех примерах этой книги.

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

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

Примечание. При желании можно продолжать работу, просто импортируя Foundation.h. Но если вы хотите импортировать конкретные файлы, показанные в каждом примере, то удалите файл имя лрошз РгеАх.рсЬ, который автоматически включается системой XCode при создании нового проекта Foundation Tool. При удалении этого файла из проекта обязательно выберите «Delete References» (Удалить ссылки), когда появится запрос Xcode. 15.1. Числовые объекты

Вес числовые типы данных, с которыми мы работали до сих пор (такие, как int, float и long) это базовые типы данных в Objective-C. Они не являются объектами, мы не можем передавать им сообщения. Однако время от времени нам нужно работать с ними как с объектами. Например, объект– класса Foundation NSArray позволяет задавать массив, в котором можно сохранять значения. Эти значения должны быть объектами. В таких массивах нельзя непосредственно сохранять базовые типы данных. Вместо этого для сохранения любого из базовых числовых типов данных (включая тип данных char) служит класс NSNumber. Он позволяет создавать объекты из этих типов данных (см. программу 15.1). // Работа с числами #import #import #import #import int main (int arge, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] initj; NSNumber *myNumber, *floalNumber, *inlNumber; NSInteger mylnt; // целое значение (int) intNumber = [NSNumber numberWithlnteger: 100]; mylnt – [intNumber integerValue]; NSLog (@"%li", (long) mylnt); // значение удвоенной длины (long) myNumber = [NSNumber numberWithlong: Oxabcdef]; NSLog (@"%lx", [myNumber longValue]); // значение типа char myNumber = [NSNumber numberWithChar: X]; NSLog (@"%c", [myNumber charValue]); // значение с плавающей точкой (float) floatNumber = [NSNumber numberWithFloat: 100.00]; NSLog (@"%g", [floatNumber floatValue]); // значение с двойной точностью (double) myNumber = [NSNumber numberWithDouble: 12345e+15]; NSLog (@"%lg", [myNumber doubleValue]); // Здесь неверный доступ NSLog (@"%Г, [myNumber integerValue]); // Сравнение двух чисел на равенство if ([intNumber isEqualToNumber: floatNumber] == YES) NSLog (@"Numbers are equal"); (Числа равны) else NSLog (@"Numbers are not equal"); (Числа не равны) // Сравнение одного числа со вторым (<, == или >) if ([intNumber compare: myNumber] == NSOrderedAscending) NSLog (@"First number is less than second"); (1-e число меньше 2-ro) [pool drain]; return 0; }

Вывод программы 15.1 100 abcdef X 100 1.2345e+19 0 Numbers are equal (Числа равны) First number is less than second (1 -e число меньше 2-го)

Файл требуется для работы с числами из класса NSNumber. Краткий обзор автоматически высвобождаемого пула (autorelease pool)

Первая строка программы 15.1 присутствовала в каждой программе этой книги. В следующей строке выполняется резервирование пространства в памяти для автоматически высвобождаемого пула (пула автоматического освобождения памяти, autorelease-пул), который назначается для переменной pool. NSAutoreleasePool * pool = [ [ NSAutoreleasePoolalloc] init];

Autorelease-пул автоматически освобождает память, занимаемую объектами, когда объект добавляется в этот пул. Объект добавляется в пул, когда ему передается сообщение autorelease. Когда пул высвобождается, то высвобождаются и все объекты, которые были в него добавлены. Все такие объекты ликвидируются, если для них не было указано, что они существуют вне области действия autorelease-пула (это указывается счетчиками ссылок – reference count).

Обычно вам не нужно думать о высвобождении объекта, возвращаемого ка-ким-либо методом Foundation. Иногда этим объектом владеет метод, который возвращает его. Иногда объект создается заново и добавляется в autoreiease-пул самим методом. Однако, как описывается в части I, вы все же должны высво-бождать любые объекты (включая объекты Foundation), которые создаете явным образом с помощью метода alloc, когда прекращаете их использование.

Примечание. Вы также должны высвобождать объекты, создаваемые методом сору (см. главу 17).

В главе 17 дается полное описание счетчиков ссылок, autorelease-пула и кон-цепции автоматической сборки мусора (garbage collection).

Вернемся к программе 15.1. Класс NSNumber содержит много методов, по-зволяющих создавать объекты NSNumber с начальными значениями. Например, в строке intNumber = [NSNumber numberWithlnteger: 100];

создается объект из целой переменной, значение которой равно 100.

Значение, которое считывается из объекта класса NSNumber, должно быть согласовано с типом значения объекта. Так, в следующем операторе программы выражение [intNumber integerValue]

используется для считывания целого значения, хранящегося в intNumber, и оно сохраняется в переменной mylntTHnaNSInteger. Отметим, что NSInteger – не объект, а typedef-определение для базового типа данных. Это тип long для 64-битных систем или тип int для 32-битных систем. Аналогичный оператор typecef задан для NSUInteger, чтобы работать с целыми без знака (unsigned).

При вызове NSLog выполняется приведение типа NSInteger mylnt к long. Симво-лы формата %li обеспечивают корректную передачу и вывод значен ия, даже если программа компилируется для 32-битной архитектуры.

Для каждого базового значения метод class выделяет память для объекта NSNumber и присваивает ему указанное значение. Имена этих методов начи-наются с numberWith, после чего следует тип, например, numberWithLong:, numberWithFloat: и т.д. Кроме того, можно использовать методы экземпляра, что-бы присвоить объекту NSNumber (для которого была выделена память) указанное значение. Имена этих методов начинаются с initWith, например, initWithLong: и initWithFloat:.

В таблице 15.1 приводится список методов класса и экземпляра, с помощью которых можно задавать значения для объектов @@ NSNumber, и соответству-ющие методы экземпляра для считывания их значений.

Табл. 15.1. Методы создания и считывания значений объектов NSNumber Метод,класса для создания и инициализации Метод экземпляра для инициализации Метод экземпляра для считывания numberWithChar: InitWithChar: charValue numberWthUnsignedChar: initWthUnsignedChar: unsignedCharValue numberWithShort: initWithShort: shortValue numberWithUnsignedShort: initWithllnsignedShort: unsignedShortValue numberWithlnteger: initWithlnteger: integerValue numberWithUnsignedlnteger: initWithllnsignedlnteger: unsignedlntegerValue numberWithlnt: initWithlnt: intValueunsigned numberWithllnsignedlnt: initWithUnsignedlnt: unsignedlntValue numbefWithLong: initWithLong: longValue numbetWithUnsignedLong: inifWithUnsignedLong: unsignedLongValue numberWithLonglong: initWithLongLong: longlongValue numberWithllnsignedLongLong: initWithUnsignedLongLong: unsigned LongLongValue numberWithFloat: initWithFloat: floatValue numberWithDouble: initWthDouble: doubleValue numberWthBool: initWithBool: boolValue

Вернемся к программе 15.I. Методы класса служат для создания объектов NSNumber типа long, char, float и double. Рассмотрим, что происходит после созда-ния объекта типа double с помощью строки myNumber = [NSNumber numberWithDouble: 12345е+15];

и последующей (неверной) попытки считывания и вывода его значения с помощью строки NSLog (@"%i", [myNumber integerValue]};

Выводится результат О

Кроме того, мы не получаем от системы сообщения об ошибке. В общем случае именно вы должны обеспечить правильность считывания значения после его сохранения в объекте NSNumber.

В операторе if в выражении с сообщением [intNumber isEqualToNumber: floatNumber]

метод isEqualToNumber: выполняет числовое сравнение двух объектов NSNumber по возвращаемому булевому значению.

Метод compare: позволяет сравнивать числовые значения. Выражение с со-общением [intNumber compare: myNumber]

возвращает значение NSOrderedAscending, если числовое значение, хранящееся в intNumber, меньше числового значения, содержащегося в myNumber; возвращает значение NSOrderedSame, если эти два числа равны; возвращает значение NSOrderedDescending, если первое число больше второго. Эти возвращаемые значении определены в заголовочном файле NSObjecth.

Отметим, что вы не можете реинициализировать значение созданного ранее объекта NSNumber. Например, с помощью приведенного ниже оператора нельзя задать значение целого элемента, сохраненного в объекте NSNumber myNumber. [myNumber initWithlnt: 1000];

При выполнении программы этот оператор даст ошибку. Все числовые объекты должны создаваться заново, а это означает, что нужно вызывать либо один из методов первого столбца таблицы 15.1 класса NSNumber, либо один из методов столбца 2 с результатом метода alloc. myNumber = [[NSNumber alloc] initWithlnt: 1000];

Конечно, при таком способе создания объекта myNumber вы сами должны высвобождать занимаемую им память с помощью оператора [myNumber release];

Мы будем использовать объекты класса NSNumber в остальных программах этой главы. 15.2. Строковые объекты

Мы уже работали со строковыми объектами в предыдущих главах. Заключая последовательность символов в кавычки, как в @"Programming is fun" (Программировать интересно),

мы создаем в Objective-C объект символьной строки. Для работы с объектами символьных строк Foundation framework поддерживает класс с именем NSString. С-строки состоят из символов типа char, а объекты класса NSString состоят из символов типа unichar. Unichar-символ – это многобайтный символ, соответству-ющий стандарту Unicode. Это позволяет работать с наборами символов, содер-жащими буквально миллионы символов. Вам не нужно заботиться о внутреннем представлении этих символов в строках, поскольку класс NSString автоматически делает это для вас. С помощью методов из этого класса легко разрабатывать приложения, доступные для локализации, то есть для работы на различных языках по всему миру.

Как вы уже знаете, для создания в Objective-C объекта константной сим-вольной строки нужно поместить символ @ перед строкой символов, заключенной в кавычки. Например, с помощью выражения @"Программировать интересно"

создается объект константной символьной строки. Это константная символьная строка, принадлежащая классу NSConstantString. NSConstantString – это подкласс класса строковых объектов NSString. Чтобы использовать строковые объекты в программах, нужно включать в них строку #import Дополнительно о функции NSLog

В программе 15.2 показано, как определить объект класса NSString и присвоить ему начальное значение и как использовать символы формата %@ для вывода объекта NSString. #import #import #import int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *str = @"Программировать интересно"; NSLog (@"%@", str); [pool drain]; return 0; }

Вывод программы 15.2 Программировать интересно

В операторе NSString *str = @"Программировать интересно";

Объект константной строки "Программировать интересно"" присваивается переменной str класса NSString. Затем ее значение выводится с помощью NSLog.

Символы формата %@ в NSLog позволяют выводить значения любых объек-тов. Например, если задано NSNumber *intNumber = [NSNumber numberWithlnteger: 100];

то в результате вызова NSLog NSLog(@"%@", intNumber);

выводится 100

Мы можем даже применять символы формата %@ для вывода всего содер-жимого массивов, словарей и наборов. С их помощью можно также выводить объекты ваших собственных классов, если вы замещаете метод rtescription, на-следуемый вашим классом. Если нет замещения этого метода, то NSLog просто выводит имя класса и адрес объекта в памяти (что я кляется реализацией по умолчан ию метода description, наследуемого из класса NSObject). Мутабельные (mutable) и немутабельные (immutable) объекты

С помощью выражения @"Программировать интересно"

мы создаем объект, содержимое которог о нельзя изменить. Такой объект назы-вается немутабельным (immutable). Класс NSString используется для немутабель– ных строк, но нередко при работе со строками требуется изменять символы внутри строки, например, удалить или заменить некоторые символы. Для работы со строками этого типа предназначен класс NSMutabieString.

В программе 15.3 показаны основные способы работы с немугабельными символьными строками. // Основные операции со строками #import #import #import < Foundation/N SAuto releasePool.h> int main (int argc, char *argv(]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString *str1 = @"This is string A"; NSString *str2 = @'This is string B"; NSString *res; NSComparisonResult compareResult; // Подсчет числа символов NSLog (@"Length of str 1: %lu", [strl length]); // Копирование одной строки в другую res = [NSString stringWithString: strl]; NSLog (@"copy: %@", res); // Копирование одной строки в конец другой str2 = [strl stringByAppendingString: str2]; NSLog (@"Concatentation: %@", str2); // Проверка на равенство двух строк if ([strl isEqualToString: res] == YES) NSLog (@"str1 == res"); else NSLog (@"str1 != res"); // Сравнение одной строки с другой (<, == или >) compareResult = [strl compare: str2]; if (compareResult == NSOrderedAscending) NSLog (@"str1 < str2"); else if (compareResult == NSOrderedSame) NSLog (@"str1 == str2"); else // NSOrderedDescending NSLog (@"str1 > str2"); // Преобразование символов строки в верхний регистр (в прописные буквы) res = [strl uppercaseString]; NSLog (@"Uppercase conversion: %s", [res UTF8String]); // Преобразование символов строки в нижний регистр (в строчные буквы) res = [strl lowercaseString]; NSLog (@"Lowercase conversion: %@", res); NSLog (@"Original string: %@", strl); [pool drain]; return 0; }

Вывод программы 15.3 Length of strl: 16 (Длина strl) Copy: This is string А (Копирование: это строка A) Concatentation: This is string AThis is string В (Конкатенация: это строка Аэто строка В)) strl == res strl < str2 Uppercase conversion: THIS IS STRING А (Преобразование в верхний регистр: ЭТО СТРОКА А) Lowercase conversion: this is string а (Преобразование в нижний регистр: это строка а} Original string: This is string А (Исходная строка: это строка А)

В программе 15.3 сначала объявляются три немутабельных объекта класса NSString: strl, str2 и res. Первые два инициализируются как объекты константных символьных строк. В объявлении NSComparisonResult compareResult;

указывается, что compareResult будет содержать результат операции сравнения строк, которая будет выполнена в этой программе.

Метод length можно использовать для подсчета числа символов строки. Он возвращает целое значение без знака типа NSUInteger. Вывод подтверждает, что строка @"Thi$ is string А" действительно содержит 16 символов. Оператор res = [NSString stringWithString: strl];

показывает, как создать новую символьную строку с содержимым другой строки. Результирующий объект класса NSString присваивается объекту res и затем выводится для подтверждения результатов. Здесь создается фактическая копия содержимого строки, а не только другая ссылка на ту же строку в памяти. Это означает, что strl и res ссылаются на два различных строковых объекта, что от-личается от простого присваивания res = strl;

где просто создается еще одна ссылка на тот же объект в памяти.

Метод stringByAppendingString: позволяет объединять две символьные строки. Например, с помощью выражения [strl stringByAppendingString: str2]

создается новый строковый объект, содержащий символы из strl, после которых следуют символы из str2, и этот объект возвращается как результат. Эта операция не влияет на исходные строковые объекты strl и str2, поскольку они являются немутабсльными строковыми объектами.

За тем метод isEqualToString: проверяет две строки на равенство символов. Метод compare: позволяет определить их упорядоченность, например, сортировку массива строк. Аналогично методу compare:, который мы использовали выше для сравнения двух объектов класса NSNumber, результатом сравнения является NSOrderedAscending, если первая строка лексически меньше второй строки, NSOrderedSame, если строки равны, и NSOrderedDescending, если первая строка лексически больше второй. Если вам не нужно учитывать регистр букв, исполь-зуйте метод caselnsensitiveCompare: вместо метода compare:. В этом случае два строковых объекта @"Gregory" и @ngregory" будут считаться равными.

Методы uppercaseString и lowercaseString преобразуют строки в верхний и ниж-ний регистр соответственно. Это преобразование тоже не влияет на исходные строки, что подтверждается последней строкой вывода.

В программе 15.4 показаны дополнительные методы для работы со строками. С помощью этих методов можно извлекать подстроки и п роверять одну строку на присутствие в другой строке.

В некоторых методах требуется идентифицировать подстроку, указав диа-пазон. Диапазон (range) задается с помощью начального индекса (порядкового номера) и числа символов. Порядковые номера начинаются с нуля; например, первые три символа строки указываются парой чисел {0,3}. В некоторых методах класса NSString (а также других классов Foundation) для описания диапазона используется специальный тип данных NSRange. Он определен в файле foundation/ NSRange.h> (который включен для вас из ) и является на самом деле typedef-определением структуры, содержащей два компонента: location (позиция) и length (длина), каждый из которых определен с типом NSUinteger. Этот тип данных используется в программе 15.4,

Примечание. Описание структур см. в главе 13 и в следующих разделах этой главы. // Основные операции со строками – Продолжение #import #import #import int main (int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Извлечение первых трех символов из строки res = [str1 substringToIndex: 3]; NSLog (@"First 3 chars of str1: %@", res); // Извлечение символов до конца строки, начиная с индекса 5 res = [strl substringFromlndex: 5]; NSLog (@"Chars from index 5 of strl: %@", res); // Извлечение символов, начиная с номера 8, до номера 13 (6 символов) res = [[strl substringFromlndex: 8] substringToIndex: б]; NSLog (@"Chars from index 8 through 13: %@", res); // Более простой способ сделать то же самое res = [strl substringWithRange: NSMakeRange (8, 6)]; NSLog (@"Chars from index 8 through 13: %@", res); // Проверка присутствия одной строки внутри другой subRange = [str1 rangeOfString: @"string A"]; NSLog ((@"String is at index %lu, length is %lu", subRange.location, subRange.length); subRange = [str1 rangeOfString: @"string B"j; if (subRange.location == NSNotFound) NSLog (@"String not found"); else NSLog (@"String is at index %lu, length is %lu", subRange.location, subRange.length); [pool drain]; return 0; }

Вывод программы 15,4 First 3 chars of str1: Thi (Первые 3 символа str1) Chars from index 5 of str1: is string А (Символы str1, начиная с номера 5) Chars from index 8 through 13: string (Символы с номерами 8-13) Chars from index 8 through 13: string String is at index 8, length is 8 (Строка, начиная с номера 8, длина 8) String not found (Строка не найдена)

Метод substringToIndex: создаст подстроку от первого символа указанной строки до символа с указанным индексом (но не включая сам этот символ). По-скольку отсчет индексов начинается с 0, аргумент со значением 3 означает, что нужно извлечь из строки символы с номерами 0, 1 и 2 и возвратить результиру-ющий строковый объект. Для любого из строковых методов, которым в качестве одного из аргументов передается индекс, выводится сообщение об ошибке «Range or index out of bounds» (Диапазон или индекс вне допустимых границ), если указан неверный индекс для данной строки.

Метод substringFromlndex: возвращает подстроку из строки-получателя сооб-щения от символа с указанным индексом до конца строки. Выражение res = [[str1 substringFromlndex: 8] substringToIndex: 6);

показывает, как сочетать эти методы для извлечения подстроки символов изнутри строки. Сначала используется метод substringFromlndex: для извлечения сим-волов, начиная с номера 8, вплоть до конца строки. Затем к результату приме-няется метод substringToIndex: для получения первых 6 символов. Конечным результатом является подстрока, представляющая диапазон символов {8, 6} из исходной строки.

Метод substringWittiRange: делает за один шаг то, что мы только что сделали за два. Ему передается диапазон, и он возвращает строку в указанном диапазоне. Специальная функция NSMakeRange (8, 6)

создает диапазон из своего аргумента и возвращает результат, который передается как аргумент методу substringWittiRange:.

Чтобы найти одну строку внутри другой, можно использовать метод rangeOfString:. Если указанная строка найдена внутри строки-получателя, возвра-щаемое значение диапазона точно указывает, где найдена эта строка. Если строка не найдена, то компонент location содержит значение NSNotFound. Например, оператор subRange = [strl rangeOfString: @"string A"];

присваивает структуру NSRange, возвращаемую этим методом, переменной subRange типа NSRange. Обратите внимание, что subRange – это не переменная– объект, а переменная-структура (объявление subRange в этой программе не со-держит звездочку). Компоненты этой структуры можно получать с помощью оператора «точка». Таким образом, выражение subRange.location дает значение компонента location (позиция) этой структуры, a subRange.length дает значение компонента length (длина). Эти значения передаются для вывода функции NSLog. Мутабельные строки

Для создания строковых объектов, символы которых доступны для изменения, применяется класс NSMutableString. Поскольку он является подклассом NSString, можно использовать все методы класса NSString.

Когда мы сравниваем возможности мутабельных строковых объектов с не– мутабельными, то имеем в виду изменение конкретных символов внутри строки. Как мутабельному, таки немутабельному строковому объекту во время вы-полнения программы можно присвоить совершенно другой строковый объект. strl = @"This is a string"; strl = [strl substringFromlndex: 5];

В данном случае объекту strl сначала присваивается константный строковый объект, затем в программе ему присваивается подстрока. В данном случае strl можно объявить и как мутабельный, и как немутабельный строковый объект. В программе 15.5 показаны некоторые способы работы с мутабельными строками в программах. // Основные операции со строками – м/табельные строки #import #import #import int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *strl = @'This is string A"; NSString *search, *replace; NSMutableString *rnstr; NSRange substr; // Создание мутабельных строк из немутабельных rnstr = [NSMutableString stringWithString: strl]; NSLog rnstr); // Вставка символов [mstr insertString: @" mutable" atlndex: 7]; NSLog(@"%@", rnstr); // Фактическая конкатенация при вставке в конец [mstr insertstring: @" and string В" atlndex: [mstr length]]; NSLog (@"%@", rnstr); // Или непосредственное использование appendString [mstr appendString: @" and string C"]; NSLog (@"%@", rnstr); // Удаление подстроки с указанным диапазоном [mstr deleteCharactersInRange: NSMakeRange (16, 13)]; NSLog (@"%@", rnstr); // Сначала определение диапазона и затем его использование для удаления substr = [rnstr rangeOIString: @"string В and "]; if (substr.location != NSNotFound) { [mstr deleteCharactersInRange: substr]; NSLog(@"%@", mstr); } // Непосредственное задание мутабельной строки [mstr setString: @"This is string A"]; NSLog (@"%@", mstr); // Теперь заменяем диапазон символов другой строкой [mstr replaceCharactersInRange: NSMakeRange(8, 8) withString: @"a mutable string"]; NSLog (@"%@", mstr); // Поиск и замена search = @"This is"; replace = @"An example of"; substr = [mstr rangeOfString: search]; if (substr.location != NSNotFound) { [mstr replaceCharactersInRange: substr withString: replace]; NSLog (@"%@", mstr); } // Поиск и замена всех экземпляров search = @"а"; replace = @"Х"; substr = [mstr rangeOfString: search]; while (substr.location != NSNotFound) { [mstr replaceCharactersInRange: substr withString: replace]; substr = [mstr rangeOfString: search]; } NSLog (@"%@", mstr); [pool drain]; return 0; }


    Ваша оценка произведения:

Популярные книги за неделю