Шрифт:
Как вы уже знаете, для создания в 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,