Вход/Регистрация
Программирование на 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);

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

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

  • Читать дальше
  • 1
  • ...
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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