Чтение онлайн

ЖАНРЫ

Программирование на Objective-C 2.0
Шрифт:

Язык Objective-C позволяет задавать диапазон значений, которые могут быть присвоены переменной. Определение перечислимого типа данных инициируется с помощью ключевого слова enum. Сразу после этого ключевого слова еле- дует имя перечислимого типа данных и затем список идентификаторов (заключенных в фигурные скобки), которые определяют допустимые значения для этого типа. В следующем операторе определяется тип данных flag: enum flag { false, true };

Теоретически этому типу данных внутри программы могут быть присвоены только значения true и false. К сожалению, компилятор Objective-C не выдает предупреждающего сообщения, если это правило нарушается.

Чтобы

объявить переменную типа enum flag, нужно снова использовать ключевое слово enum, после которого следует имя перечислимого типа и список переменных. Например, в следующем операторе определяются две переменные типа flag: endOfData и matchFound. enum flag endOfData, matchFound;

Единственные значения, которые могут быть присвоены этим переменным — true и false. Следующие операторы являются допустимыми. endOfData = true; if ( matchFound == false )

Если вам нужно, чтобы определенное целое значение было связано с идентификатором перечисления, это целое значение можно присвоить идентификатору, когда определяется тип данных. Идентификаторам перечисления, которые появляются затем в списке, будут присвоены последовательные целые значения, начиная с указанного целого значения, увеличенного на I.

В следующем определении перечислимый тип данных direction определяется со значениями up, down, left и right. enum direction { up, down, left = 10, right}; (вверх, вниз, влево, вправо)

Компилятор присвоит значение 0 идентификатору up, поскольку он представлен первым в списке, присвоит 1 идентификатору down, поскольку он является следующим в списке, присвоит 10 идентификатору left, поскольку здесь явно задано это значение, и присвоит 11 идентификатору right, поскольку это увеличенное на 1 значение предыдущего идентификатора в списке.

Идентификаторы перечисления могут иметь одинаковое значение. Например, если в строке enum boolean { no = 0, false = 0, yes = 1, true = 1 };

булевой переменной типа enum присваивается значение по или false, то ей присваивается значение 0; если присваивается значение yes или true, то присваивается значение 1.

Ниже приводится еще один пример определения перечислимого типа данных. В нем определяется тип enum month с допустимыми значениями, которые могут быть присвоены переменной этого типа — названиями месяцев. enum month { january = 1, february, march, april, may, june, july, august, September, October, november, december};

Компилятор Objective-C интерпретирует идентификаторы перечисления как целые константы. Переменной thisMonth будет присвоено значение 2 (а не а не название месяца february), если программа содержит следующие две строки: enum month thisMonth; thisMonth = february;

В программе 10.3 используются перечислимые типы данных. В ней читается номер месяца, а затем выполняется оператор switch, чтобы определить, какой месяц был введен. Напомним, что перечислимые значения интерпретируются как целые константы, поэтому они являются допустимыми case-значениями.

Переменной days присваивается число дней в указанном месяце, и ее значение выводится после выхода из оператора switch. Для февраля (February) введена специальная проверка. // вывод числа дней месяца int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; enum month { january = 1, february, march, april, may, june, july, august, September, October, november, d ecem b er}; enum month amonth; int days; NSLog (@"Enter month number:"); scant ("%i", &amonth); switch (amonth) { case january: case march: case may: case july: case august: case October: case december: days = 31; break; case april: case june: case September: case november: days = 30; break; case february: days = 28; break; default: NSLog (@>"bad month number"); days = 0; break; } if ( days != 0) NSLog (@"Number of days is %i", days); if ( amonth == february) NSLog (@"...or 29 if it’s a leap year"); [pool drain]; return 0; }

Вывод

программы 10.3 Enter month number: (Введите номер месяца) 5 Number of days is 31 (Число дней = 31) Вывод программы 10.3 (повторный запуск) Enter month number: 2 Number of days is 28 ...or 29 if it's a leap year (Число дней = 28 ... или 29, если это високосный год)

Вы можете явно присвоить целое значение переменной перечислимого типа данных; это делается с помощью оператора приведения типа (type cast). Н апример, если monthValue является переменной целого типа, имеющей значение 6, то следующее выражение является допустимым. lastMonth = (enum month) (monthValue • 1);

Если вы не используете оператор приведения типа, компилятор, к сожалению, нс реагирует на это.

При использовании программ с перечислимыми типами данных старайтесь не полагаться на то, что перечислимые значения интерпретируются как целые числа. Вместо этого их следует рассматривать как отдельные типы данных. Перечислимый тип данных позволяет связывать символическое имя с целым чис- лом. Если вам потребуется изменить значение этого числа, вам придется изменить его только в том месте, где определено перечисление. Если вы делаете предположения, основанные на фактическом значении перечислимого типа данных, то теряете преимущество перечисления.

При определении перечислимого типа данных имя типа данных может не указываться, и переменные могут быть объявлены как конкретный перечислимый тип данных, если этот тип определен.

Оператор enum { east, west, south, north } direction;

определяет неименованный перечислимый тип данных со значениями east, west, south и north (восток, запад, юг и север) и объявляет переменную (direction) этого типа.

Определение перечислимого типа данных в блоке ограничивает область действия этого определения данным блоком. С другой стороны, определение перечислимого типа данных в начале программы (вне какого-либо блока) делает определение глобальным для данного файла.

Определяя перечислимый тип данных, вы должны проследить, чтобы идентификаторы перечисления были уникальными по отношению к именам других переменных и идентификаторам перечисления, определенным в той же области действия. 10.5. Оператор typedef

Objective-C позволяет назначать для типа данных альтернативное имя. Для этого используется оператор typedef. В следующей строке определяется имя Counter (счетчик) как эквивалент типа данных Objective-C int. typedef int Counter;

Затем можно объявить переменные с типом Counter, как в следующей строке. Counter j, n;

Компилятор Objective-C будет интерпретировать это как объявление обычных целых переменных j и п. Определение j и п посредством typedef указывает назначение переменных в программе. Объявление в традиционной форме с типом int оставило бы их назначение непонятным.Ниже с помощью typedef определяется тип с именем NumberObject для объектов типа Number. typedef Number *NumberObject;

Переменные, которые объявляются затем с типом NumberObject, как в строке NumberObject myValuel, myValue2, myResult; будут интерпретироваться так, как если бы они были объявлены обычным образом: Number *myValue1, *myValue2, *myResult;

Поделиться с друзьями: