Шрифт:
Вывод программы 15.14 abstract class: A class defined so other classes can inherit from it (абстрактный класс: класс, определенный таким образом, чтобы другие классы могли наследовать из него) adopt: То implement all the methods defined in a protocol (принять: для реализации всех методов, определенных в протоколе) archiving: Storing an object for later use (архивация: сохранение объекта для дальнейшего использования)
С помощью выражения [NSMutableDictionary dictionary]
создается пустой мутабельный словарь. Мы можем добавлять в этот словарь пары ключ-значение с помощью метода setObject:forKey:. После создания словаря мы можем считывать значение для заданного ключа с помощью метода objectForKey:. В программе 15.14 показано считывание и вывод этих трех записей. В более близком к практике приложении пользователь вводит слово, и программа вы-полняет поиск определения этого слова в словаре. Перечисление записей словаря
В программе 15.15 показано, как можно определить словарь с начальными парами «ключ-значение» с помощью метода dictionaryWithObjectsAndKeys:. Мы создадим немутабельный словарь и покажем, как применяется цикл с быстрым пе-речислением для считывания каждого элемента из словаря, по одному ключу за шаг. В отличие от объектов-массивов, объекты-словари не упорядочиваются, поэтому первая пара ключ-объект, помешенная в словарь, не обязательно будет первым ключом, извлекаемым при перечислении. #import < Foundation/NSObject. h> #import <Fnunriatinn/NSString.h> #import <Foundation/NSDictionary.h> #import <Foundation/NSAutoreleasePool.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys: @"A class defined so other classes can inherit from it", @"abstract class", @"To implement all the methods defined in a protocol", @"adopt", @"Storing an object for later use", @"archiving", nil ]; // Вывод всех пар ключ-значение из словаря for ( NSString *key in glossary) NSLog (@"%@%@\ key, (glossary objectForKey: key]); [pool drain]; return 0; }
Вывод программы 15.15 abstract class: A class defined so other classes can inherit from it adopt: To implement all the methods defined in a protocol archiving: Storing an object for later use
Аргументом для метода dictionaryWithObjectsAndKeys: является список пар объектключ (именно в этом порядке), разделяемых запятой. Этот список должен заканчиваться специальным объектом nil.
После создания словаря в цикле перечисляется его содержимое. Как уже говорилось, ключи считываются из словаря по очереди, без специального порядка. Если требуется вывести содержимое словаря в алфавитном порядке, можно прочитать все ключи из словаря, отсортировать их и затем считывать по порядку все значения для отсортированных ключей. Половину этой работы выполняет для вас метод keysSortedByValueUsingSelector:, возвращая отсортированные ключи в виде массива в соответствии с критериями сортировки.
Мы только что показали некоторые базовые операции со словарями. В таб-лицах 15.6 и 15.7 приводятся наиболее распространенные методы для работы с немутабельными и мутабельными словарями. Поскольку NSMutableDictionary яв-ляется подмножеством IMSDictionary, он наследует его методы.
В таблицах 15.6 и 15.7 ключи и объекты key, keyl, кеу2, nhj, ohjl и ohj2 — про-извольные объекты, и size — целое без знака (unsigned int) типа NSUInteger.
Табл. 15.6. Наиболее распространенные методы класса NSDictionary Метод Описание– (NSArray *) keysSortedByValueUsingSelector: (SEL) selector Возвращает массив ключей из словаря, отсортированных в соответствии с методом сравнения, который указывает селектор selector. -(NSEnumerator *) objectEnumerator Возвращает объект класса NSEnumerator для всех значений из словаря -(id) objectForKey: key Возвращает объект для указанного ключа key.
Табл. 15.7. Наиболее распространенные методы класса NSMutableDictionary Метод Описание +(id) dictionaryWitb Capacity: size Создает мутабельный словарь с указанным начальным размером size. -(id) initWithCapacity: size Инициализирует новый выделенный (alloc) словарь с указанным начальным размером size. -(void) removeAHObjects Удаляет все записи из словаря. -(void) removeObjectForKey: key Удаляет из словаря запись с указанным ключом key. -(void) setObject: objforKey: key Добавляет в словарь obj для ключа key и заменяет значение, если этот ключ уже существует. 15.5. Объекты-наборы
Набор, или множество (set) — это коллекция уникальных объектов. Набор может быть мутабельным или немутабельным. Для наборов можно выполнять операции поиска, добавления и удаления членов (мутабельные наборы), сравнения, поиск пересечения (intersect) и объединения (union).
Для работы с наборами в программе нужно включить следующую строку. #import <Foundation/NSSet.h>
В программе 15.16 показаны основные операции с наборами. Предположим, что нам нужно выводить содержимое наборов во время выполнения программы. Создаем новый метод с именем print и добавляем метод print в класс NSSet, создавая новую категорию с именем Printing. NSMutableSet — это подкласс NSSet, поэтому мутабельные наборы тоже могут использовать новый метод print. #import <Foundation/NSObject.h> #import <Foundation/NSSet.h> #import <Foundation/NSValue.h> #import <Foundation/NSAutoreleasePool.h> #import <Foundation/NSString.h> // Создание объекта целого типа #define INTOBJ(v) [NSNumber numberWithlnteger: v] // Добавление в NSSet метода print с помощью категории Printing @interface NSSet (Printing) -(void) print; @end @implementation NSSet (Printing) -(void) print { printf ("{"); for (NSNumber *element in self) printf (" %li", (long) [element integerValue]); printf ("}\n"); } @end int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSMutableSet *set1 = [NSMutableSet setWithObjects: INTOBJ(I), INT0BJ(3), INTOBJ(5), INTOBJ(IO), nil]; NSSet *set2 = [NSSet setWithObjects: INTOBJ(-5), INTOBJ(IOO), INTOBJ(3), INT0BJ(5), nil]; NSSet *set3 = [NSSet setWithObjects: INT0BJ( 12), 1NTOBJ(200), INT0BJ(3), nil]; NSLog (@"set1:"); [set1 print]; NSLog (<®"set2:"); [set2 print]; // Проверка на равенство if ([set 1 isEqualToSet: set2] == YES) NSLog (@"set1 equals set2n); else NSLog (@"set1 is not equal lo set2"); // Проверка членства в наборе if ([set1 containsObject: INTOBJ(IO)] == YES) NSLog (@"set1 contains 10"); else NSLog (@"setl does not contain 10"); if ([set2 containsObject: INTOBJ(10)] == YES) NSLog (@"set2 contains 10"); else NSLog (@"set2 does not contain 10"); // Добавление и удаление объектов из мутабельного набора setl [setl addObject: INTOBJ(4)]; [setl removeObject: INTOBJ(IO)]; NSLog (@"set1 after adding 4 and removing 10:"); [setl print]; // Получение пересечения двух наборов [setl intersectSet: set2]; NSLog (@"set1 intersect set2:"); [setl print]; // Объединение двух наборов [set1 unionSet:set3]; NSLog (@"set1 union set3:"); [set1 print]; [pool drain]; return 0; }
Вывод программы 15.16 set1: (набор 1) (3 10 1 5} set2: (набор 2) { 100 3-55} set1 is not equal to set2 (set1 не равен набору set2| set1 contains 10 (set1 содержит 10) set2 does not contain 10 (set2 не содержит 10) set1 after adding 4 and removing 10: (set1 после добавления 4 и удаления 10) { 3 1 5 4 } set1 intersect set2: (пересечение set1 c set2) { 3 5 } set1 union set3: {объединение setl c set3) { 12 3 5 200}
В методе print используется описанный ранее метод быстрого перечисления для считывания каждого элемента из набора и определяется макрос с именем INTOBJ для создания объекта из целого значения. Это позволяет сделать про-грамму короче и исключить необязательный ввод. Конечно, наш метод print не является достаточно обобщенным, поскольку он работает только с наборами, содержащими целые элементы. Но это хороший пример, напоминающий, как добавлять методы в класс с помощью категорий. (Отметим, что в методе print используется процедура printf библиотеки С для вывода элементов каждого на-бора в одной строке.)
Метод setWithObjects: создает новый набор из списка объектов, заканчиваю-щегося объектом nil. После создания трех наборов программа выводит первые два набора с помощью нового метода print. Затем метод isEqualToSet проверяет равенство набора setl набору set2 (они не равны).
Метод containsObject: проверяет сначала, содержится ли целый элемент 10 в наборе setl, и затем делает то же самое для набора set2. Булевы значения, воз-вращаемые этим методом, показывают, что данный элемент содержится в первом наборе и не содержится во втором.