Шрифт:
Сначала приводим новый метод сортировки из класса AddressBook. -(void) sort { [book sortUsingSelector: @selector(compareNames:)j; }
Как известно из главы 9, выражение @selector (compareNames:) создает селектор с типом SEL из имени указанного метода; это метод, который используется sortUsingSelector: для сравнения двух элементов массива. Когда требуется выполнить такое сравнение, он вызывает указанный метод, отправляя сообщение первому элементу массива (получателю) для сравнения с аргументом. Возвращаемое значение должно иметь тип NSComparisonResult.
Поскольку элементы нашей адресной книги - это объекты класса AddressCard, метод сравнения должен быть добаален в класс AddressCard. Мы должны вернуться к нашему классу AddressCard и добавить в него метод compareNames:. // Сравнение двух имен из указанных адресных карточек -(NSComparisonResult) compareNames: (id) element { return [name compare: [element name]]; }
Для строкового сравнения двух имен из адресной книги можно использовать метод NSString compare:.
Если добавить метод sort в класс AddressBook и метод compareNames; в класс AddressCard, то мы получим тестовую программу 15.13. #import "AddressBook.h" #import <Foundation/NSAutoreleasePool.h> int main (int argc, char *argv(]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *aName = @"Julia Kochan"; NSString *aEmail = @"jewls337@axlc.com"; NSString *bName = @"Tony lannino"; NSString *bErnail = @"tony.iannino@techfitness.com"; NSString *cName = @"Stephen Kochan"; NSString *cEmail = @nsteve@kochan-wood.com"; NSString *dName = @"Jamie Baker"; NSString *dEmail = @"jbaker@kochan-wood.com"; AddressCard *card1 = [[AddressCard alloc] init]; AddressCard *card2 = [[AddressCard alloc] init]; AddressCard *card3 = [[AddressCard alloc] init]; AddressCard *card4 = [[AddressCard alloc] init]; AddressBook *myBook = [AddressBook alloc]; // Сначала задаем четыре адресные карточки [card1 setName: aName andEmail: aEmail]; [card2 setName: bName andEmail: bEmail]; [card3 setName: cName andEmail: cEmail]; [card4 setName: dName andEmail: dEmail]; myBook = [myBook initWithName: @"Linda’s Address Book"]; // Добавляем несколько карточек в адресную книгу [myBook addCard: card1]; [myBook addCard: card2]; [myBook addCard: card3]; [myBook addCard: card4]; // Вывод неотсортированной книги [myBook list]; // Ее сортировка и повторный вывод [myBook sort]; [myBook list]; [card1 release]; [card2 release]; [card3 release]; [card4 release]; [myBook release]; [pool drain]; return 0; }
Вывод программы 15.13 ======== Contents of: Linda’s Address Book == Julia Kochan jewls337@axlc.com Tony lannino tony.iannino@techfitness.com Stephen Kochan steve@kochan-wood.com Jamie Baker jbaker@kochan-wood.com ==================================================== ======== Contents of: Linda’s Address Book == Jamie Baker jbaker@kochan-wood.com Julia Kochan jewls337@axlc.com Stephen Kochan steve@kochan-wood.com Tony lannino tony.iannino@techfitness.com
Отметим, ЧТО сортировка выполняется в порядке возрастания. Вы можете выполнить сортировку в порядке убывания, внеся изменения в метод compareNames: класса AddressCard, обратив смысл возвращаемых значений.
Для работы с объектами-массивами имеется более 50 методов. В таблицах 15.4 и 15.5 приводится список наиболее распространенных методов для работы с немутабельными и мутабельными массивами. NSMutableArray наследует методы класса NSArray, поскольку является его подклассом.
В таблицах 15.4 и 15.5 obj, objl и объявляются произвольными объектами; / — это значение типа NSUInteger, представляющее допустимый номер элемента в массиве, selector — это объект-селектор типа SEL, size имеет тип NSUInteger.
Табл. 15.4. Наиболее распространенные методы класса NSArray Метод Описание +(id) arrayWithObjects: obj1, obj2,... nil Создает новый массив с элементами obj1, obj2, ... -(BOOL) containsObject: obj Определяет, содержится ли objв массиве (используется метод isEqual:). -(NSUInteger) count Указывает число элементов в массиве. -(NSUInteger) indexOfObject: obj Определяет номер первого элемента, содержащего obj(используется метод isEqual:). -(id) objectAtlndex: i Указывает объект, хранящийся в элементе i. -(void) makeObjectsPerformSelector: (SEL) selector Передает каждому элементу массива сообщение, которое указывает selector. -(NSArray *) sortedArrayUsingSelector: (SEL) selector Сортирует массив в соответствии с методом сравнения, который указывает selector. -(BOOL) writeToFile: path automically: (BOOL) flag Записывает массив в указанный с помощью path файл, создавая сначала временный файл, если flag имеет значение YES.
Табл. 15.5. Наиболее распространенные методы класса NSMutableArray Метод Описание +(id) array Создает пустой массив. +(id) arrayWithCapacity: size Создает массив с указанным начальным размером. -(id) initWittiCapacity: size Инициализирует новый выделенный (alloc) массив с указанным начальным размером. -(void) addObject: obj Добавляет obj в конец массива. -(void) insertObject: obj atindex: i Выполняет вставку оbj в элемент i массива. -(void) replaceObjectAtlndex: i withObject: obj Заменяет объект в элементе i массива на obj. -(void) removeObject: obj Удаляет все экземпляры obj из массива. -(void) removeObjectAtlndex: i Удаляет элемент i из массива, смещая влево все элементы, начиная с i. -(void) sortUsingSelector: (SEL)selector Сортирует массив в соответствии с методом сравнения, который указывает selector. 15.4. Объекты-словари
Словарь (dictionary) — это коллекция данных, состоящая из пар ключ-объект. Как в обычном словаре, мы получаем из словаря Objective-C значение (объект) по его кп ючу. Ключи в словаре должны быть уникальными, и они могут быть объектом любого типа, хотя обычно это строки. Значение, соответствующее ключу, тоже может быть объектом любого типа, но не должно быть значение nil.
Словари могут быть мутабельными или немутабельными; в первом случае в них можно динамически добавлять и удалять записи. В словарях можно выполнять поиск по определенному' ключу, их содержимое можно делать перечислимым. В программе 15.14 создается словарь терминов Objective-C, и в нем заполняются первые три записи.
Для использования словарей нужно включить следующую строку. #import <Foundation/NSDictionary.h> #import <Foundation/NSObject.h> #import <Foundation/NSString.h> #import <Foundation/NSDictionary.h> #import <Foundation/NSAutoreleasePool.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSMutableDictionary *glossary = [NSMutableDictionary dictionary]; // Сохранение трех записей в этом словаре [glossary setOhject: @"A class defined so other classes can inherit from it" forKey: @"abstract class" ]; [glossary setObject: @'To implement all the methods defined in a protocol" forKey: @"adopt"]; [glossary setObject: @''Storing an object for later use" forKey: @"archiving"]; // Их считывание и вывод NSLog (@"abstract class: %@", [glossary objectForKey: @"abstract class"]); NSLog (@"adopt: %@\ [glossary objectForKey: @"adopt"]); NSLog (@"archiving: %@", [glossary objectForKey: @"archiving"]); [pool drain]; return 0; }