>NSLog(@"Mutable Array = %@", mutableArray);
>Вывод этой программы таков:
>Immutable array = (
>"String 1",
>"String 2",
>"String 3"
>)
>Mutable Array = (
>"String 1",
>"String 3"
>)
Еще одна распространенная коллекция, которая часто встречается в программах для iOS, – это словарь. Словари похожи на массивы, но каждому объекту в словаре присваивается ключ, и по этому ключу вы можете позже получить интересующий вас объект. Рассмотрим пример:
>NSDictionary *personInformation =
>@{
>@"firstName": @"Mark",
>@"lastName": @"Tremonti",
>@"age": @30,
>@"sex": @"Male"
>};
>NSString *firstName = personInformation[@"firstName"];
>NSString *lastName = personInformation[@"lastName"];
>NSNumber *age = personInformation[@"age"];
>NSString *sex = personInformation[@"sex"];
>NSLog(@"Full name = %@ %@", firstName, lastName);
>NSLog(@"Age = %@, Sex = %@", age, sex);
>А вот и вывод этой программы:
>Full name = Mark Tremonti
>Age = 30, Sex = Male
Можно также использовать изменяемые словари, которые довольно сильно похожи на изменяемые массивы. Содержимое изменяемого словаря можно изменить после того, как словарь инстанцирован. Пример:
>NSDictionary *personInformation =
>@{
>@"firstName": @"Mark",
>@"lastName": @"Tremonti",
>@"age": @30,
>@"sex": @"Male"
>};
>NSMutableDictionary *mutablePersonInformation =
>[[NSMutableDictionary alloc] initWithDictionary: personInformation];
>mutablePersonInformation[@"age"] = @32;
>NSLog(@"Information = %@", mutablePersonInformation);
>Вывод этой программы таков:
>Information = {
>age = 32;
>firstName = Mark;
>lastName = Tremonti;
>sex = Male;
>}
Еще можно работать с множествами. Множества похожи на массивы, но любой объект, входящий в состав множества, должен встречаться в нем только один раз. Иными словами, в одном множестве не может быть двух экземпляров одного и того же объекта. Пример множества:
>NSSet *shoppingList = [[NSSet alloc] initWithObjects:
>@"Milk",
>@"Bananas",
>@"Bread",
>@"Milk", nil];
>NSLog(@"Shopping list = %@", shoppingList);
>Запустив эту программу, вы получите следующий вывод:
>Shopping list = {(
>Milk,
>Bananas,
>Bread
>)}
Обратите внимание: элемент Milk упомянут в программе дважды, а в множество добавлен всего один раз. Эта черта множеств – настоящее волшебство. Изменяемые множества можно использовать и вот так:
>NSSet *shoppingList = [[NSSet alloc] initWithObjects:
>@"Milk",
>@"Bananas",
>@"Bread",
>@"Milk", nil];
>NSMutableSet *mutableList = [NSMutableSet setWithSet: shoppingList];
>[mutableList addObject:@"Yogurt"];
>[mutableList removeObject:@"Bread"];
>NSLog(@"Original list = %@", shoppingList);
>NSLog(@"Mutable list = %@", mutableList);
>А вывод будет таким:
>Original list = {(
>Milk,
>Bananas,
>Bread
>)}
>Mutable list = {(
>Milk,
>Bananas,
>Yogurt
>)}
Обсуждая множества и коллекции, следует упомянуть еще два важных класса, о которых вам необходимо знать:
• NSOrderedSet – неизменяемое множество, учитывающее, в каком порядке в него добавлялись объекты;
• NSMutableOrderedSet – изменяемый вариант вышеупомянутого изменяемого множества.
По умолчанию множества не учитывают, в каком порядке объекты в них добавлялись. Рассмотрим пример:
>NSSet *setOfNumbers = [NSSet setWithArray:@[@3, @4, @1, @5, @10]];
>NSLog(@"Set of numbers = %@", setOfNumbers);
>Запустив эту программу, получим на экране следующий вывод:
>Set of numbers = {(
>5,
>10,
>3,
>4,
>1
>)}
Но на самом деле мы наполняли множество элементами в другом порядке. Если вы хотите сохранить правильный порядок, просто воспользуйтесь классом NSOrderedSet:
>NSOrderedSet *setOfNumbers = [NSOrderedSet orderedSetWithArray
>:@[@3, @4, @1, @5, @10]];
>NSLog(@"Ordered set of numbers = %@", setOfNumbers);
>Разумеется, вы можете воспользоваться и изменяемой версией упорядоченного множества: