Objective-C型別轉換


型別轉換是一種將變數從一種資料型別轉換為另一種資料型別的方法。 例如,如果要將long值儲存到簡單整數(int)中,則可以將long型別轉換設定為int。使用強制轉換運算子將值從一種型別轉換為另一種型別,如下所示 -

(type_name) expression

在Objective-C中,通常使用CGFloat進行浮點運算,它是在32位情況下從基本型別的float派生的,在64位情況下是double型別。參考以下範例,使用轉換運算子將一個整數變數除以另一個整數變數,結果為浮點數 -

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

執行上面範例程式碼,得到以下結果:

2018-11-15 09:25:04.889 main[28822] Value of mean : 3.400000

這裡應該注意,強制轉換操作符優先於除法,因此sum的值首先轉換為double型別,最後除以count,得到double型別的值。

型別轉換可以是隱式的,由編譯器自動執行,也可以通過使用轉換運算子顯式指定。每當需要型別轉換時,使用強制轉換運算子是一種很好的程式設計習慣。

整型提升

整數提升是將整數型別「小於」 intunsigned int的值轉換為intunsigned int的過程。 考慮在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;
}

當執行上面範例程式碼時,得到以下結果:

2018-11-15 09:28:10.138 main[110351] Value of sum : 116

這裡,sum的值將變為116,因為編譯器進行整數提升,並在執行加法運算之前將字元'c'的值轉換為ascii值。

通用的算術轉換

隱式執行通常的算術轉換以將它們的值轉換為通用型別。編譯器首先執行整數提升,如果運算元仍然具有不同的型別,則它們將轉換為在以下層次結構中顯示最高的型別 -

通常的算術轉換不是為賦值運算子執行,也不是為邏輯運算子&&||執行。下面看一個例子來理解這個概念 -

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

執行上面範例程式碼,得到以下結果:

2018-11-15 09:28:10.138 main[110351] Value of sum : 116

在這裡,很容易理解第一個c字元被轉換為整數,但是因為最終值是float,所以通常的算術轉換適用,編譯器將ic轉換為float並相加,所以最終產生的是float型別。