Данная статья посвящена интересному и необходимому в работе классу NSSet. NSSet предназначен для создания несортированных массивов данных (например каких-либо объектов). Существует модифицируемая версия класса NSSet — это NSMutableSet, используя которую можно добавлять и удалять элементы. Стоит обратить внимание, что объект, который хранится в NSSet, встречается только один раз. Т.е. все элементы NSSet — уникальные.

NSSet

Добавить дубликат элемента в NSMutableSet у вас также не получится. Для создания несортированного массива, в котором можно использовать неуникальные элементы, можно использовать NSCountedSet. Основным преимуществом NSCountedSet перед использованием классического массива NSArray является то, что элемент может быть продублирован огромное количество раз и при этом занимать памяти как один элемент. Это объясняется тем, что NSCountedSet хранит в памяти только одну копию элемента и запоминает сколько раз этот элемент встречается.

Напомним, что для вывода результатов мы будем использовать функцию NSLog(), которая выводит строку в консоль. Консоль можно увидеть внизу окна XCode при запуске приложения. Если консоль не открывается, то выберите пункт меню View->Show Debug Area (⇧⌘Y).

Создание NSSet

Самый простой метод для создания нового экземпляра класса NSSet — это метод setWithObjects:

NSSet *set = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0",nil];

NSLog(@"%@", set);

В консоли вы должны увидеть элементы, которые содержат цифры от 0 до 9. Обратите внимание, что элементы NSSet не сохраняются в том порядке, в котором вы их задаете, а также не имеют какой-либо сортировки. Для того, чтобы убедиться в том, что элементы NSSet не дублируются напишем следующий код:

NSSet *set = [NSSet setWithObjects:@"1", @"1", @"1", @"1", @"2", @"2", @"2", @"2", @"3", @"3",nil];

NSLog(@"%@", set);

В данном случае в консоли вы увидите только элементы с 1 по 3. Все остальные дубликаты будут удалены автоматически. Следующий наиболее используемый метод для создания NSSet — setWithArray:

NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0",nil];

NSSet *set = [NSSet setWithArray:array];
NSLog(@"%@", set);

Здесь мы берем заранее имеющийся массив с элементами и на его основе создаем новый объект NSSet. Здесь можно задаться вопросом: «имеет ли смысл использовать NSSet вместо NSArray в том случае, если все элементы уникальные?». Ответ — да! Если для вас не важен порядок элементов внутри массива и вы используете действительно большие объемы информации, то использование NSSet повысит производительность приложения за счет снижения потребляемой памяти. Несмотря на то, что количество элементов хранящихся в памяти будет одинаковым, NSSet не тратит память на то, чтобы помнить в какой последовательности хранятся элементы. Далее рассмотрим вариант создания NSSet с помощью метода setWithArray при условии, что элементы массива будут дублироваться:

NSArray *array = [NSArray arrayWithObjects:@"1", @"1", @"1", @"1", @"2", @"2", @"2", @"2", @"3", @"3",nil];

NSSet *set = [NSSet setWithArray:array];
NSLog(@"%@", set);

В консоли мы должны увидеть только три элемента. Как и предыдущий метод setWithObjects метод setWithArray убирает дублирующиеся элементы. Этот код можно смело использовать, если вам потребуется создать массив NSArray, состоящий только из уникальных элементов (создаение NSArray из NSSet мы рассмотрим ниже).

Методы для работы с NSSet

Первый с знакомый нам метод — count, возвращает количество элементов в объекте NSSet:

NSSet *set = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0",nil];

NSLog(@"%d", [set count]);

В косоли должно быть указано 10. Следующий метод allObjects предназачен для получения массива NSArray их элементов, входящих в NSSet:

NSSet *set = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0",nil];

NSArray *array = [set allObjects];
NSLog(@"%@", array);

Следующий метод anyObject — возвращает один из объектов, входящих в NSSet:

NSSet *set = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0",nil];

NSString *temp = [set anyObject];
NSLog(@"%@", temp);

В данном случае нам известно, что элементы входящие в set являются объемами NSString. Соответственно нами был создан объект temp класса NSString. Однако можно использовать данный метод не зная (или не учитывая) класс возвращаемого объекта. Запустите следующий код и вы увидите, что результат будет одиннаковый:

NSSet *set = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0",nil];

id temp = [set anyObject];
NSLog(@"%@", temp);

Указатель id может хранить любой объект любого класса. Также обратите внимание, что метод anyObject возвращает один из элементов, но не случайный элемент. Следующие два метода выполняют схожие действия: метод member — проверяет на наличие элемента внутри NSSet и возвращает его, а второй метод containsObject — возвращает «TRUE», если искомый элемент встречается внутри NSSet:

NSSet *set = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0",nil];

id temp = [set member:@"1"];
NSLog(@"%@", temp);
NSSet *set = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0",nil];
BOOL temp = [set containsObject:@"1"];
if (temp) {
NSLog(@"yes");
}

В первом примере в консоль будет выведен найденный элемент, а во втором — только «yes». Следующий метод позволяет обратится к каждому находящемуся внутри NSSet элементу — objectEnumerator:

NSSet *set = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0",nil];

NSEnumerator *enumerator = [set objectEnumerator];
id value;
while ((value = [enumerator nextObject])) {
NSLog(@"%@", value);
}

С помощью данного метода можно выполнять любые действия над элементами, входящими в NSSet.

Сравнение NSSet

Метода intersectsSet сравнивает два объекта NSSet и передает «TRUE» в случае, если хотя бы один из элементов присутствует в двух NSSet:

NSSet *set1 = [NSSet setWithObjects:@"1", @"2", @"3", @"4",nil];

NSSet *set2 = [NSSet setWithObjects:@"3", @"4", @"5", @"6",nil];
BOOL temp = [set1 intersectsSet:set2];
if (temp) {
NSLog(@"yes");
}

В консоли увидим «yes». Метод isEqualToSet сравнивает два объекта NSSet и передает «TRUE» в случае, если все элементы присутствуют в двух NSSet:

NSSet *set1 = [NSSet setWithObjects:@"1", @"2", @"3", @"4",nil];

NSSet *set2 = [NSSet setWithObjects:@"3", @"4", @"5", @"6",nil];
BOOL temp = [set1 isEqualToSet:set2];
if (temp) {
NSLog(@"yes");
}
else {
NSLog(@"no");
}

В консоли увидим «no». Следующий метод isSubsetOfSet — возвращает «TRUE» в случае если элементы одного NSSet являются частью элементов другого NSSet:

NSSet *set1 = [NSSet setWithObjects:@"3", @"4", @"5", @"6",nil];

NSSet *set2 = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", @"6",nil];
BOOL temp = [set1 isSubsetOfSet:set2];
if (temp) {
NSLog(@"yes");
}
else {
NSLog(@"no");
}

В консоли увидим «yes».

Использование NSMutableSet

NSMutableSet является подклассом NSSet с один дополнением — его можно редактировать после создания. В классе NSMutableSet можно выделить два важных метода. Добавить элемент и удалить элемент. Начнем с добавления элемента с помощью метода addObject:

NSMutableSet *set = [NSMutableSet setWithObjects:@"1", @"2", @"3", @"4",nil];

NSLog(@"%@", set);
[set addObject:@"5"];
NSLog(@"%@", set);

В данном примере мы добавляем элемент «5». Удаление происходит с помощью метода removeObject:

NSMutableSet *set = [NSMutableSet setWithObjects:@"1", @"2", @"3", @"4",nil];

NSLog(@"%@", set);
[set removeObject:@"4"];
NSLog(@"%@", set);

Как видите — здесь тоже все просто.

Использование NSCountedSet

NSCountedSet — это подкласс NSSet и в целом больше похоже на другой подкласс NSMutableSet. Элементы в NSCountedSet могут дублироваться и могут быть модифицированы. В NSCountedSet присутствуют методы addObject и removeObject, а также дополнительный метод countForObject, который возвращает количество вхождений заданного элемента:

NSCountedSet *set = [NSCountedSet setWithObjects:@"1", @"1", @"3", @"4",nil];

NSLog(@"%d", [set countForObject:@"1"]);

В консоли мы увидим цифру 2 — именно столько раз элемент «1» встречается в созданном NSCountedSet.

Заключение

Использование объектов класса NSSet и его подклассов может существенно повысить производительность приложения при работе с большими объемами информации, которые не требуют строго порядка внутри массива. Более подробно с методами данных классов можно ознакомиться в документации XCode.

Последние статьи

  • [Swift] Урок 1 — Пишем программу «Hello, World» на Swift языке под iOS

  • Audio Unit в iOS. Часть 3, накладываем эффект Delay

  • Audio Unit в iOS. Часть 2, строим граф и проигрываем файлы

  • Audio Unit в iOS. Часть 1, введение.

  • Используем Emoji в своих приложениях

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *