Язык программирования С - строго типизированный. Каждая переменная до ее использования должна быть объявлена, и должен быть указан ее тип данных.

Объявление может также включать явную инициализацию, придающую переменной значение; объявленная, но явно неинициализированная переменная имеет неопределенное значение (и должна рассматриваться как источник опасностей, пока она не инициализирована). В книге K6'R объявления С должны предшествовать всем прочим инструкциям, но в современных версиях С это правило ослаблено, так что вы не обязаны объявлять переменную до самого начала ее использования:

int height = 2;
int width = height * 2;
height = height + 1;
int area = height * width;

Все фундаментальные встроенные типы данных в языке С являются числовыми: char (один байт), int (4 байта), float и douЫe (числа с плавающей точкой) и такие разновидности, как short (короткое целое число), long (длинное целое), unsigned short и т.д. По желанию тип числового литерала может выразить с помощью буквы (или букв) суффикса: например, 4 имеет тип int, но 4UL имеет тип unsigned long; 4.0 представляет собой douЬle, но 4. Of относится к типу float. Язык Objective-C позволяет использовать некоторые другие числовые типы, производные от числовых типов языка С (с помощью инструкции typedef, см. K&R 6.7), разработанных для 64-битового процессора; наиболее важными из них являются NSinteger (наряду с NSUinteger) и CGFloat. Вам не нужно использовать их, если только интерфейс API явно не требует этого, и даже когда вы их используете, просто думайте об объекте типа NSinteger как о числе типа int, а об объекте типа CGFloat как о числе типа float, и все будет хорошо.

 

Для приведения типа значения переменной явным образом к другому типу перед именем переменной указывается имя этого другого типа в скобках:

int height = 2:
float fheight = (float)height;

В этом конкретном примере явное приведение не является необходимым, поскольку целое значение преобразуется в значение с плавающей точкой неявно при присваивании переменной соответствующего типа и дано в иллюстративных целях. В языке Objective-C вы встретите совсем мало приведений типов, в основном применяемых для того, чтобы компилятор не выдавал излишних предупреждений (с примерами вы ознакомитесь в главе 3).

Еще одним видом числовой инициализации являются перечисления, или enum (K&R 2.3). Это способ назначить имена последовательных числовых значений, и он полезен, когда значение представляет собой одно из нескольких возможных значений. Интерфейс API каркаса Сосоа широко применяет этот метод. Например, три возможных типа анимации строки состояния можно определить следующим образом:

typedef enum { UIStatusBarAnimationNone,
               UIStatusBarAnimationFade,
               UIStatusBarAnimationSlide,
             } UIStatusBarAnimation;

Это определение назначает значение 0 имени UIStatusBarAnimationNone, значение 1 имени UIStatusBarAnimationFade и значение 2 имени UIStatusBarAnimationSlide. При этом вы можете использовать значимые имена, не заботясь о числовых значениях (и даже не зная их), которые эти имена представляют. Это полезная идиома, и у вас может быть множество причин для определения перечислений в собственном коде.

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

Предположим, например, что вы пишете следующий код:

UIStatusBarAnimation anim ~ UIInterfaceOrientationPortrait;

Это вполне разрешенное действие; UIInterfaceOrientationPortrait представляет собой не что иное, как другое имя для 0, так же, как если бы вы указали UIStatusBarAnimationNone. Однако оно взято из перечисления с другим именем, а именно UIInterfaceOrientation. Компилятор это обнаруживает и выдает соответствующее предупреждение. Как и в случае реальных типов данных, вы можете подавить вывод таких предупреждений с помощью приведения типов.

В системе IOS 7 анимация строки состояния определена следующим образом:

typedef NS_ENUМ(NSinteger,UIStatusBarAnimation)

UIStatusBarAnimationNone, UIStatusBarAnimationFade, UIStatusBarAnimationSlide, };

Такая запись введена в компиляторе LLVMв версии 4.0, дебют которой состоялся в версии Xcode 4.4. NS _ ENUМ представляет собой макрос, вид текстовой подстановки препроцессором, который рассматривается в конце этой главы; при выполнении подстановки указанный код превращается в следующий:

typedef enum UIStatusBarAnimation :
                     NSinteqer UIStatusBarAnimation;
enum UIStatusBarAnimation : NSinteqer {
                    UIStatusBarAnimationNone,
                    UIStatusBarAnimationFade,
                    UIStatusBarAnimationSlide, };

Этот код выглядит почти так же, как и старое выражение того же перечисления, но новый способ в1С11ючает некоторые обозначения, не являющиеся частью стандартного С, говорящие компьютеру о том, какие именно целочисленные значения здесь использованы (в данном случае NSinteger). Это делает UIStatusBarAnimation еще более похожим на истинный тип данных; кроме того, новая запись перечисления позволяет среде Xcode еще более разумно помочь вам при использовании автодопо11Нения, описанного в главе 9. Еще один макрос, NS_OPTIONS, вычисляется в Objective-C JCaJC синоним NS_ENUМ (они различны только в коде С++, который в данной статье не рассматривается). '

Строка кажется фундаментальным текстовым типом в С, но на самом деле это и1111юзия; за кулисами она выглядит JCaJC массив элементов типа char, завершающийся нулевым символом. Например, в С можно написать строковый литерал как

"strinq"

На самом деле это семь 7 байт, которые представляют собой числовые (ASCII) эквиваленты каждой буквы, последний из которых - байт с числовым значением нуль, обозначающий конец строки. Эта структура данных. именуемая С-строкой, редко встречается при программировании для IOS. В общем случае при работе со строками вы будете использовать тип объекта Objective-C, который называется NSString. Он полностью отличается от С-строки. Однако Objective-C позволяет записывать литералы NSString способом, очень похожим на строковый литерал С:

@"strinq"

Обратите внимание на символ @1 Это выражение в действительности представляет собой директиву компилятору Objective-C о том, что надо создать объект класса NSString. Распространенная ошибка новичков - отсутствующий символ @, в результате чего выражение интерпретируется как С-строка, которая на самом деле является совершенно другой сущностью.

Поскольку запись литералов NSString моделируется записью С-строк, о них стоит знать еще кое-что (с чем вы, впрочем, можете и не встретиться). Так, в книге Kd-R перечислен ряд управляющих символов (Kd-R 2.3). которые можно использовать в литерале NSString, в том числе следующие.

\ n Символ новой строки в Unix.
\ t Символ табуляции.
\ " Двойная кавычка (предваряется управляющим символом, чтобы указать, что это не конец строкового литерала). \ \ Обратная косая черта.

Объекты класса NSString изначально ориентированы на использование колировки Unicode, так что вполне можно использовать символы, не являющиеся АSСП-символами, непосредственно в литералах NSString; предупреждения об обратном являются устаревшими, и вы должны игнорировать их. Неплохо знать о наличии управляющих последовательностей \х и \u, но они вам вряд ли понадобятся.

В книге K&R также упоминается запись конкатенации строковых литералов, при которой несколько строковых литералов, разделенных только пробельными символами, автоматически объединяются и рассматриваются как один строковый литерал. Эта запись полезна при разбиении длинных символьных литералов на несколько строк для удобочитаемости, и Objective-C также использует это соглашение для литералов NSString, с тем отличием, что вы должны помнить о символе @:

@"Это большая минная строка символов, "
@"которую я разделил на две строки исходного текста.";

 

 

 

Добавить комментарий


Защитный код
Обновить