Коллекции – это такие объекты, в экземплярах которых могут храниться другие объекты. Одна из самых распространенных разновидностей коллекций – это массив, который инстанцирует NSArray или NSMutableArray. В массиве можно хранить любой объект, причем массив может содержать несколько экземпляров одного и того же объекта. В следующем примере мы создаем массив из трех строк:
>NSArray *stringsArray = @[
>@"String 1",
>@"String 2",
>@"String 3"
>];
>__unused NSString *firstString = stringsArray[0];
>__unused NSString *secondString = stringsArray[1];
>__unused NSString *thirdString = stringsArray[2];
Макрос __unused приказывает компилятору «не жаловаться», когда переменная – в нашем случае переменная firstString – объявлена, но ни разу не использовалась. По умолчанию в такой ситуации компилятор выдает в консоль предупреждение, сообщающее, что переменная не используется. В нашем кратком примере мы объявили переменные, но не задействовали их. Поэтому, если добавить вышеупомянутый макрос в начале объявления переменной, это вполне устроит и нас, и компилятор.
Изменяемый массив – это такой массив, в который можно вносить изменения уже после того, как он был создан. Как мы видели ранее, неизменяемый массив не может быть дополнен новой информацией уже после создания. Вот пример неизменяемого массива:
>NSString *string1 = @"String 1";
>NSString *string2 = @"String 2";
>NSString *string3 = @"String 3";
>NSArray *immutableArray = @[string1, string2, string3];
>NSMutableArray *mutableArray = [[NSMutableArray alloc]
>initWithArray: immutableArray];
>[mutableArray exchangeObjectAtIndex:0 withObjectAtIndex:1];
>[mutableArray removeObjectAtIndex:1];
>[mutableArray setObject: string1 atIndexedSubscript:0];
>NSLog(@"Immutable array = %@", immutableArray);
>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;
>}
Еще можно работать с множествами. Множества похожи на массивы, но любой объект, входящий в состав множества, должен встречаться в нем только один раз. Иными словами, в одном множестве не может быть двух экземпляров одного и того же объекта. Пример множества: