ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C Часть 1

NSRange (диапазоны)

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

NSRange — это структура, которую применяют для описания групп, рядов, секций таких как секция символов, либо группа объектов в массиве. Ниже приведена структура класса NSRange.

<code data-result="[object Object]">typedefstruct _NSRange {
    NSInteger location;
    NSInteger length;
} NSRange;</code>

Как видно с описания структуры NSRange имеет два значения (location и length). Значение location указывает расположение начала секции на всем отрезке. К примеру строка — это наш отрезок и каждый сивмол строки имеет свой порядковый номер, так вот в locationхраниться порядковый номер символа с которого мы хотим начать выделение нашей секции. А length хранит длинну нашей секции.

К примеру, у нас есть строка «Student name: Ivan». Давайте узнаем диапазон слова «Ivan» . Интересующее нас слово начинается с буквы «I», в исходной строке эта бука 14-я по счету (нумерация начинается с нуля). Само слово «Ivan» состоит с четырех знаков. Соответственно диапазоном этого слова будет NSRange(14, 4).

Чтобы задать значения объекту типа NSRange не обязательно использовать функцию NSMakeRange. Это можно сделать следующим способом:
Чтобы убедиться в том, что мы все сделали правильно давайте создадим проект на основе представления (View-based Application) и назовем его Range. Теперь откройте файл RangeViewController.m и раскомментируйте в нем метод viewDidLoad и добавьте в него несколько строк:

<code data-result="[object Object]">NSString *s = @"Student name: Ivan";
NSRange r = NSMakeRange(14, 4);
NSLog(@"%@", [s substringWithRange:r]);</code>

В первой строке этого кода мы создаем переменную s строкового типа и присваиваем ей значение. Затем мы создаем еще одну переменную r, которая имеет тип NSRange. При объявлении переменной r мы так же ей присваиваем значение. Делается это с помощью функции NSMakeRange, в которую мы передаем значения location и length. В результате выполнения этого кода мы получим:

2011-03-19 17:18:28.587 Range[2851:207] Ivan

Чтобы задать значения объекту типа NSRange не обязательно использовать функцию NSMakeRange. Это можно сделать следующим способом:

<code data-result="[object Object]">NSRange r1;
r1.location = 14;
r1.length = 4;
NSLog(@"r1.location = %i  r1.length = %i", r1.location, r1.length);</code>

Давайте еще попрактикуемся с форматированием строк. Следующий пример демонстрирует возможность удаления первых семи символов со строки, которая хранит адрес сайта.

<code data-result="[object Object]">NSString *url = @"http://imaladec.com";
NSRange range = NSMakeRange(7, [url length]-7);
NSString *subString = [url substringWithRange:range];
NSLog(@"subString = %@", subString);</code>

Самым непонятным в этом коде может быть вторая строка, а точнее то место, где мы создаем диапазон. В параметре location мы указали порядковый номер символа, с которого начнется наш диапазон. В параметре length мы указали разницу между всей длинной строки и порядковым номером символа с которого начинается диапазон (длинна диапазона не может превышать длинну всей строки).

Для проверки равенства диапазонов следует использовать метод NSEqualRanges.

<code data-result="[object Object]">BOOL equal = NSEqualRanges(r, r1);
NSLog(@"r is equal r1? %i", equal);</code>

В качестве параметров этого метода мы передаем два диапазона, которые хотим сравнить.

В этой небольшой статье я описал базовые понятия структуры NSRange. Елси какие-то методы работы с этой структурой не вошли в статью — вы можете написать об этом в комментариях и я внесу изменения.
Исходный код можно скачать здесь.

Comments are closed.