Шрифт:
Objective-C предоставляет большие возможности в определении структур. На-пример, можно определить структуру, содержащую в качестве своих компонен-тов другие структуры, или определять структуры, содержащие массивы.
Вы уже видели, как логически группировать месяц, день и год (month, day и year) в структуре с именем date. Предположим, что у нас есть аналогичная струк-тура с именем time для группирования часов, минут и секунд (hour, minutes и seconds). В некоторых приложениях может потребоваться логическая группи-ровка структур date и time — например, для списка событий с определенной датой и временем.
Из предыдущего описания следует, что нам нужны удобные средства, объе-диняющие дату и время. Это можно сделать в Objective-C, определив новую структуру (например, date_and_time), компоненты которой содержатся в элементах date и time. struct date_and_time { struct date sdate; struct time stime; };
Первый компонент этой структуры имеет тип struct date и называется sdate. Второй компонент структуры date_and_time имеет тип struct time и называется stime. В этом определении структуры date_and_time требуется, чтобы структура date и структура time были предварительно определены для компилятора.
Теперь можно определять переменные типа struct date_and_time: struct date_and_time event;
Для указания ссылки на структуру date в переменной event используется тот же синтаксис: event.sdate
Мы можем вызвать функцию dateUpdate, указав дату в качестве аргумента, чтобы получить результат в том же месте. event.sdate = dateUpdate (event.sdate);
То же самое можно сделать для структуры time, содержащейся в структуре date_and_time. event.stime = timeUpdate (event.stime);
Для указания определенного компонента внутри одной из этих структур нужно добавить точку и имя этого компонента: event.sdate.month = 10;
В этом операторе задается значение 10 (октябрь) для компонента month структуры date переменной event. В операторе ++event.stime.seconds;
значение компонента seconds структуры time увеличивается на 1.
Инициализировать переменную event можно уже известным способом: struct date_and_time event = {{ 12, 17, 1989 }, { 3, 30,0}};
Здесь для переменной event задается дата 17 декабря 1989 г. и время 3:30:00.
Массив структур date_and_time можно задать с помощью объявления struct date_and_time events[100];
Здесь объявляется, что массив events содержит 100 элементов типа struct date_and_time. Для указания 4-го элемента date_and_time в массиве нужно написать events[3], а для 25-й даты в массиве при обращении к функции dateUpdate нужно написать events[24].sdate = dateUpdate (events[24].sdate);
Чтобы записать 12 часов дня в первый элемент этого массива, применяется следующий набор операторов. events[0].stime.hour = 12; events[0].stime.minutes = 0; events[0].stime.seconds = 0; Дополнительно о структурах
Определять структуру можно достаточно гибко. Во-первых, можно объявить переменную с определенным структурным типом одновременно с объявлением структуры. Для этого достаточно включить имя переменной (переменных) с завершающей точкой с запятой в определение структуры. Например, в следую-щем операторе определяется структура date и объявляются переменные todaysDate и purchaseDate этого типа. struct date { int month; int day; int year; } todaysDate, purchaseDate;
Вы можете присвоить этим переменным начальные значения обычным об-разом. Ниже определяется структура date и переменная todaysDate с указанием начальных значений. struct date { int month; int day; int year; } todaysDate = { 9, 25, 2010 };
Если все переменные определенного структурного типа определяются вместе с определением структуры, то можно не задавать имя структуры. Ниже оп-ределяется массив с именем dates, содержащий 100 элементов. struct { int month; int day; int year; } dates[ 100);
Каждый элемент является структурой, содержащей три целых компонента: month, day и year. Поскольку здесь не указывается имя структуры, при последующем объявлении переменных того же типа структуру придется явно определить снова. Битовые поля
В Objective-C имеются два способа упаковки информации. Первый способ — это представление данных внутри переменной целого типа и последующий доступ к нужным битам с помощью побитовых операций, описанных в главе 4.
Второй способ — это определение структуры упакованной информации с помощью конструкции Objective-C, которая называется битовым полем (bitfield). Для этого применяется специальный синтаксис в определении структуры, по-зволяющий определять поле битов и присваивать ему имя.
Для определения битовых полей можно определить структуру, например, с именем packedStruct. struct packedStruct { unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int type:4; unsigned int index:9; }