Rzutowanie typu Objective-C

Rzutowanie typu to sposób na przekonwertowanie zmiennej z jednego typu danych na inny typ danych. Na przykład, jeśli chcesz zapisać długą wartość w prostej liczbie całkowitej, możesz wpisać rzut long na int. Można jawnie konwertować wartości z jednego typu na inny przy użyciu rozszerzeniacast operator w następujący sposób -

(type_name) expression

W Objective-C generalnie używamy CGFloat do wykonywania operacji zmiennoprzecinkowych, która pochodzi od podstawowego typu float w przypadku 32-bitów i double w przypadku 64-bitów. Rozważmy następujący przykład, w którym operator rzutowania powoduje, że dzielenie jednej zmiennej całkowitej przez inną jest wykonywane jako operacja zmiennoprzecinkowa -

#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;
}

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

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

Należy tutaj zauważyć, że operator rzutowania ma pierwszeństwo przed dzieleniem, więc wartość sum jest najpierw konwertowany na typ double i na koniec jest dzielony przez liczbę, co daje podwójną wartość.

Konwersje typów mogą być niejawne, które są wykonywane przez kompilator automatycznie lub można je określić jawnie za pomocą cast operator. Uważa się, że dobrą praktyką programistyczną jest używanie operatora rzutowania, gdy konieczne są konwersje typów.

Promocja Integer

Promocja liczb całkowitych to proces, w którym wartości typu całkowitego są „mniejsze” niż int lub unsigned int są konwertowane na int lub unsigned int. Rozważmy przykład dodawania znaku w int -

#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;
}

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

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

Tutaj wartość sumy wynosi 116, ponieważ kompilator wykonuje promocję liczb całkowitych i konwertuje wartość „c” na ascii przed wykonaniem operacji dodawania.

Zwykłe konwersje arytmetyczne

Plik usual arithmetic conversionssą niejawnie wykonywane w celu rzutowania ich wartości na wspólny typ. Kompilator najpierw przeprowadza promocję liczb całkowitych , jeśli operandy nadal mają różne typy, są konwertowane na typ, który pojawia się najwyżej w następującej hierarchii -

Zwykłe konwersje arytmetyczne nie są wykonywane dla operatorów przypisania ani dla operatorów logicznych && i ||. Weźmy następujący przykład, aby zrozumieć koncepcję -

#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;
}

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

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

Tutaj łatwo jest zrozumieć, że pierwsze c jest konwertowane na liczbę całkowitą, ale ponieważ wartość końcowa jest zmiennoprzecinkowa, więc stosuje się zwykłą konwersję arytmetyczną, a kompilator konwertuje i i c na zmiennoprzecinkowe i dodaje je, otrzymując wynik typu float.