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

на главную - закладки

Жанры

Программирование на 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;

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Тринадцатый VI

NikL
6. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VI

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Законы Рода. Том 10

Андрей Мельник
10. Граф Берестьев
Фантастика:
юмористическая фантастика
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 10

Имя нам Легион. Том 5

Дорничев Дмитрий
5. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 5

Дракон

Бубела Олег Николаевич
5. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.31
рейтинг книги
Дракон

Черный дембель. Часть 3

Федин Андрей Анатольевич
3. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 3

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3

Защитник

Кораблев Родион
11. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Защитник

Поводырь

Щепетнов Евгений Владимирович
3. Ботаник
Фантастика:
фэнтези
6.17
рейтинг книги
Поводырь

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Неудержимый. Книга XXXVII

Боярский Андрей
37. Неудержимый
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXXVII

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл