Программирование на Objective-C 2.0
Шрифт:
Метод substringWittiRange: делает за один шаг то, что мы только что сделали за два. Ему передается диапазон, и он возвращает строку в указанном диапазоне. Специальная функция NSMakeRange (8, 6)
создает диапазон из своего аргумента и возвращает результат, который передается как аргумент методу substringWittiRange:.
Чтобы найти одну строку внутри другой, можно использовать метод rangeOfString:. Если указанная строка найдена внутри строки-получателя, возвра-щаемое значение диапазона точно указывает, где найдена эта строка. Если строка не найдена, то компонент location содержит значение NSNotFound. Например, оператор subRange = [strl rangeOfString: @"string A"];
присваивает структуру NSRange, возвращаемую этим методом, переменной subRange типа NSRange. Обратите
Для создания строковых объектов, символы которых доступны для изменения, применяется класс NSMutableString. Поскольку он является подклассом NSString, можно использовать все методы класса NSString.
Когда мы сравниваем возможности мутабельных строковых объектов с не- мутабельными, то имеем в виду изменение конкретных символов внутри строки. Как мутабельному, таки немутабельному строковому объекту во время вы-полнения программы можно присвоить совершенно другой строковый объект. strl = @"This is a string"; strl = [strl substringFromlndex: 5];
В данном случае объекту strl сначала присваивается константный строковый объект, затем в программе ему присваивается подстрока. В данном случае strl можно объявить и как мутабельный, и как немутабельный строковый объект. В программе 15.5 показаны некоторые способы работы с мутабельными строками в программах. // Основные операции со строками - м/табельные строки #import <Foundation/NSObject.h> #import <Foundation/NSString.h> #import <Foundation/NSAutoreleasePool.h> 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; }
Вывод программы 15.5 This is string А (Это строка A) This is mutable string А (Это мутабельная строка A) This is mutable string A and string В (Это мутабельные строка А и строка В) This is mutable string A and string В and string С (Это мутабельные строка А, строка В и строка С) This is mutable string В and string С (Это мутабельные строка В и строка С) This is mutable string С (Это мутабельная строка С) This is string А (Это строка А) This is a mutable string (Это
мутабельная строка) An example of a mutable string An exXmple of X mutXble stringОбъявление NSMutableString *mstr;
определяет mstr как переменную со строковым объектом, содержимое которого может изменяться во время выполнения программы. В операторе mstr = [NSMutableString stringWithString: strl];
переменной mstr присваивается строковый объект, содержимое которого является копией символов, содержащихся в strl, то есть 'This is string А". Если метод stringWithString: передается классу NSMutableString, возвращаемым результатом является мутабельный строковый объект. Если он передается классу NSString, как в программе 15.5, то мы получаем немутабельный строковый объект.
Метод insertString:atlndex: выполняет вставку указанной символьной строки в строку-получатель, начиная с указанного индекса (порядкового номера). В данном случае выполняется вставка mutable" в строку, начиная с индекса 7, то есть перед восьмым символом строки. В отличие от методов для немутабель- ных строковых объектов, никакого значения не возвращается, поскольку модифицируется строка-получатель. При втором вызове insertstring:atlndex: используется метод length для вставки одной символьной строки в конец другой. Метод appendString: позволяет выполнить эту задачу несколько проще.
С помощью метода deleteCharactersInRange: можно удалить заданное число символов из строки. Применение диапазона (16, 13) к строке This is mutable string A and string В and string C
позволяет удалить 13 символов "string A and", начиная с индекса 16 (то есть с 17-го символа строки). Это показано на рис. 15.1.
Рис. 15.1. Индексы позиций в строке
В следующих строках программы 15.5 метод rangeOfString: позволяет сначала найти строку, а затем удалить ее. После проверки, что строка @"string В and" действительно содержит mstr, применяется метод deleteCharactersInRange: для удаления этих символов с использованием диапазона, возвращаемого методом rangeOfString:, в качестве аргумента.
Метод setString: применяется для непосредственного задания содержимого мутабельного строкового объекта. После присвоения строки <§>'This is string А" несколько символов этой строки заменяются другой строкой с помощью метода replaceCharacterstnRange:. Размеры заменяемой и заменяющей строк могут быть неодинаковыми; одну строку можно заменить строкой равного или неравного размера. Например, в операторе [mstr replaceCharacterstnRange: NSMakeRange(8, 8) withString: @"a mutable string"];
8 символов "string А" заменяются на 16 символов "a mutable string".
В остальной части этой программы показано, как выполнять операции поиска и замены. В первом случае внутри строки mstr ищется строка @"This is" (сначала mstr была присвоена строка @This is a mutable string"). Эта строка находится в строке поиска и заменяется строкой @"An example of". В результате содержимое mstr заменяется строкой @"An example of a mutable string".
Далее в программе выполняется цикл, показывающий, как выполнить опе-рацию «найти и заменить все». Строке поиска присваивается значение @"а", и строке замены присваивается значение @Т*,
Если строка замены содержит также строку поиска (например, нужно заменить строку "а" на строку "аХ"), то мы получим бесконечный цикл.
Во-вторых, в случае пустой строки замены (когда она не содержит никаких символов) мы фактически удаляем все экземпляры строки поиска. Пустая кон-стантная символьная строка задается парой смежных кавычек без пробелов: replace = @"";
Конечно, если мы хотим просто удалить экземпляр сгроки, то можно ис-пользовать метод deleteCharactersInRange:.
И, наконец, класс NSMutahleString содержит метод с именем replaceOccurrencesOfString:withString:options:range: для операции «найти и заменить все» в строке. Цикл while программы 15.5 можно было бы заменить одним оператором. [mstr replaceOccurrencesOfString: search withString: replace options: nil range: NSMakeRange (0, [mstr length])];