Учебники

Objective-C Тип Кастинг

Приведение типов — это способ преобразования переменной из одного типа данных в другой тип данных. Например, если вы хотите сохранить длинное значение в простое целое число, вы можете набрать cast long для int. Вы можете явно преобразовать значения из одного типа в другой, используя оператор приведения, следующим образом:

(type_name) expression

В Objective-C мы обычно используем CGFloat для выполнения операции с плавающей запятой, которая получена из базового типа с плавающей запятой в случае 32-разрядного и двойного в случае 64-разрядного. Рассмотрим следующий пример, где оператор приведения заставляет деление одной целочисленной переменной на другую как операцию с плавающей запятой:

Live Demo

#import <Foundation/Foundation.h>

int main() {
   int sum = 17, count = 5;
   CGFloat mean;

   mean = (CGFloat) sum / count;
   NSLog(@"Value of mean : %f\n", mean );

   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

2013-09-11 01:35:40.047 demo[20634] Value of mean : 3.400000

Здесь следует отметить, что оператор приведения имеет приоритет над делением, поэтому значение суммы сначала преобразуется в тип double и, наконец, оно делится на число, что приводит к двойному значению.

Преобразования типов могут быть неявными, которые выполняются компилятором автоматически, или они могут быть указаны явно с помощью оператора приведения . Хорошей практикой программирования считается использование оператора приведения, когда необходимо преобразование типа.

Целочисленное продвижение

Целочисленное продвижение — это процесс, при котором значения целочисленного типа «меньше», чем int или unsigned int , преобразуются либо в int, либо в unsigned int . Рассмотрим пример добавления символа в int —

Live Demo

#import <Foundation/Foundation.h>

int main() {
   int  i = 17;
   char c = 'c';  /* ascii value is 99 */
   int sum;

   sum = i + c;
   NSLog(@"Value of sum : %d\n", sum );

   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

2013-09-11 01:38:28.492 demo[980] Value of sum : 116

Здесь значение sum приходит как 116, потому что компилятор выполняет целочисленное продвижение и преобразует значение ‘c’ в ascii перед выполнением фактической операции сложения.

Обычное Арифметическое Преобразование

Обычные арифметические преобразования неявно выполняются для приведения их значений в общий тип. Компилятор сначала выполняет целочисленное продвижение , если операнды по-прежнему имеют разные типы, тогда они преобразуются в тип, который отображается наивысшим в следующей иерархии:

Обычное Арифметическое Преобразование

Обычные арифметические преобразования не выполняются ни для операторов присваивания, ни для логических операторов && и ||. Давайте возьмем следующий пример, чтобы понять концепцию —

Live Demo

#import <Foundation/Foundation.h>

int main() {
   int  i = 17;
   char c = 'c';  /* ascii value is 99 */
   CGFloat sum;

   sum = i + c;
   NSLog(@"Value of sum : %f\n", sum );
   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

2013-09-11 01:41:39.192 demo[15351] Value of sum : 116.000000

Здесь легко понять, что первый c преобразуется в целое число, но поскольку конечное значение равно float, то применяется обычное арифметическое преобразование, и компилятор преобразует i и c в float и добавляет их, получая результат float.