>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);

>Разумеется, вы можете воспользоваться и изменяемой версией упорядоченного множества: