Чтение онлайн

ЖАНРЫ

Программирование на Objective-C 2.0
Шрифт:

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

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

В программе 15.2 показано, как определить объект класса NSString и присвоить ему начальное значение и как использовать символы формата %@ для вывода объекта NSString. #import <Foundation/NSObject.h> #import <Foundation/NSString.h> #import <Foundation/NSAutoreleasePool.h> 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 <Foundation/NSObject.h> #import <Foundation/NSString.h> #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 <Foundation/NSObject.h> #import <Foundation/NSString.h> #import <Foundation/NSAutoreleasePool.h> 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} из исходной строки.

Поделиться с друзьями: