Главная » iPhone, Objective-C, Программирование для iOS и MacOS » NSSеt/NSМutаblеSеt Objective-C

0

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

Множества,   прежде   всего,   полезны   для   получения   ответа   на   вопрос:

«Присутствует ли объект в заданном наборе?» Например, в вашей программе может храниться набор URL-адресов, которые должны быть недоступны для детей. Прежде чем отображать веб-страницу для ребенка, следует проверить, не присутствует ли она среди URL-адресов множества. С множествами такая проверка выполняется очень быстро.

Выделенные работнику ресурсы не имеют определенного порядка хранения и не могут   повторно   входить   В   коллекцию   ресурсов   одного   работника.   Измените

программу   чтобы   вместо   NSМutаblеАrrау для   хранения   отношений   ресурсов использовался класс NSМutаbleSеt.

Рис. 21.2. Использование класса NSМutablеSеt для хранения ресурсов

В файле Employee.h измените объявление переменной:

#import "Person.h"

@class Asset;

@interface Employee : Person

{

int employeeID;

NSMutableSet *assets; }

@property int employeeID;

-­‐    (void)addAssetsObject:(Asset   *)a;

-­‐    (unsigned  int)valueOfAssets;

@end

In Employee.m, create an instance of the correct class:

-­‐    (void)addAssetsObject:(Asset   *)a

{

if (!assets) {

assets = [[NSMutableSet alloc] init];

}

[assets addObject:a]; [a setHolder:self];

}

Постройте и запустите программу. Она должна работать так же, как прежде.

К объекту множества невозможно обратиться по индексу, потому что элементы множества не упорядочены. Вместо этого можно лишь спросить: «Входит ли объект в множество?» В классе NSSet имеется соответствующий метод:

-­‐       (BOOL)containsObject:(id)x;

При отправке этого сообщения множество перебирает свою коллекцию объектов в поисках объекта, равного х. Если такой объект будет найден, метод возвращает YES; в противном случае возвращается NO.

И  тут  мы  сталкиваемся  с  достаточно  глубоким  вопросом:  что  означает

«равного»?  Класс  NSObject определяет  метод  с  именем  isEqual:,  проверяющий равенство двух объектов:

if ([myDoctor isEqual:yourTennisPartner]) {

NSLog(@"my doctor is equal to your tennis partner");

}

NSObject предоставляет простую реализацию isEqual:. Она выглядит так:

-­‐       (BOOL)isEqual:(id)other

{

return (self == other);

}

Таким образом, без переопределения метода isEqual: приведенный фрагмент эквивалентен  следующему:

if (myDoctor == yourTennisPartner) {

NSLog(@"my doctor is equal to your tennis partner");

}

Некоторые классы переопределяют isEqual:. Например, в NSString метод isEqual: переопределяется для сравнения символов строки. Для этих классов равенство не совпадает с идентичностью. Допустим, у нас имеются два указателя на строки:

NSString *x = … NSString *y = …

Значения х и у идентичны, если они содержат одинаковые адреса. Значения х и у равны, если строки, на которые они указывают, содержат одинаковые символы, следующие в одном порядке.

Таким образом, идентичные объекты всегда равны, но равные объекты не всегда

идентичны.

Важна ли эта разница? Да, важна. Например, класс NSМutаblеАrrау содержит два метода:

-­‐           (NSUInteger)indexOfObject:(id)anObject;

-­‐              (NSUInteger)indexOfObjectIdenticalTo:(id)anObject;

Первый метод перебирает коллекцию, проверяя для каждого объекта условие isEqual: anObject. Второй метод перебирает коллекцию с проверкой условия == anObject.

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии