本文有刪節:
整形資料(int)
Objective-C中的int型可以儲存正的或者負的整數(即沒有小數位),整形(int)的位元依賴於目標機,在編譯期決定,一般是32位或者64位,這個取決於程式運行平台的CPU。值得注意的是,有時候作業系統也會起到作用,比如,CPU是64位,但是跑的作業系統是32位的,那麼int只能是32位的。
在32位系統上,無符號的整形(unsigned int)的範圍是0到4294967295。在64位系統上,這個範圍是0到18,446,744,073,709,551,615。對於有符號的整形,這兩個範圍分別為−2,147,483,648到+2,147,483,647和−9,223,372,036,854,775,808到+9,223,372,036,854,775,807。
所以,在寫Objective-C的程式的時候,你唯一可以假設的是,int型至少是32位。
譯者注:在iOS上,int是32位的。
預設的情況下,int是使用十進位的數來進行賦值的,如果你想使用八進位進行賦值,請在資料前面加入一個0。如下所示:
int myoctal = 024;
同樣的,0x開頭的標識16進位:
int myhex = 0xFFA2;
字元型(char)
Objective-C的char類型是用來儲存單個字元的,類似於英文字母,十進位的數字或者標點符合。下面是這樣的例子:
char myChar = 'w';char myChar = '2';char myChar = ':';
逸出字元
除了上面這些普通的字元,有時候我們需要一些特殊的字元來標識特殊的含義,比如斷行符號換行,tab等,這些特殊的字元是以反斜線'\'開頭的,比如下面的這個就是標識斷行符號換行:
char newline = '\n';
任何以反斜線'\'開頭的都是逸出字元,那麼我們如何在字串中標識反斜線那?答案是兩個反斜線,如下所示:
char myslash = '\\'; Assign a backslash to a variable
下面是常用的逸出字元的列表:
\a - Sound alert
\b - Backspace
\f - Form feed
\n - New line
\r - Carriage return
\t - Horizontal tab
\v - Vertical tab
\\ - Backslash
\" - Double quote (used when placing a double quote into a string declaration)
\' - Single quote (used when placing a double quote into a string declaration)
浮點類型(float)
float在Objective-C中標識浮點類型的資料,即有小數部分的資料,例如456.12。一般情況下,這樣的資料被編譯器識別為另一種類型(Double,雙浮點類型),所以在賦值給float類型的時候,在資料後面加上一個f即可,就像下面這個樣子:
float myfloat = 123.432f
當我們表示一個很大的浮點數的時候,我們可以使用科學計數法,即後邊跟一個eX,X標識一個數字,比如67.7 x 104可以表示成下面的樣式:
float myfloat = 67.7e4
雙精確度浮點類型(double)
Objective-C中的double 資料類型用來儲存比float類型更大的資料,double這個詞來自於它用來儲存的bit大小是float的兩倍,就像上一節提到的那樣,浮點數據是一個double類型,除非它跟一個f來標識是一個float類型。
id類型
你會在本書後面的章節看到,Objective-C是一個物件導向的語言,物件導向語言是用類的對象來重用代碼的,調用對象的方法被來實現邏輯功能,這些方法需要傳入參數和返回一些值,這些類型可能也是一個對象,id就是一個通用的用來指向一個對象。
譯者註:
在Objective-C中對象的標識符是一個單獨的資料類型:id。這種類型是一種通用的類型可以是各種對象不管是什麼類,可以是一個類的執行個體也可以是類對象本身。
對於Objective-C的物件導向結構,例如方法的傳回值id代替int作為預設的傳回值類型。(對於嚴格的C語言結構方法傳回值的預設類型仍然是int)。
關鍵字nil被定義為空白對象一個值為0的id。Id,nil和其他Objective-C基礎類型都是在標頭檔objc/objc.h中定義的。
id被定義為一個對象資料結構的指標:
12345 |
typedef struct objc_object { Class isa; } *id; |
每一個對象都有一個isa變數來表示它是哪個類的執行個體。由於類這個類型本身被定義為一個指標,因此isa變數經常被稱為“isa 指標”。
1 |
typedef struct objc_class *Class; |
布爾類型(BOOL)
就像其他語言一樣,Objective-C也有一個用來儲存true和false的資料類型,布爾類型,這個類型使用關鍵詞_Bool或BOO來表示 ,下面的標記法都是合法的:
_Bool flag = 0;
BOOL secondflag = 1;
譯者註:和C++裡面的bool不一樣,BOOL只是一個signed char,YES=1,NO=0,只是一個約束,實際上你可以付給BOOL,YES和NO以外的值,在使用其他的數賦給一個布爾類型的時候,只取低八位,那麼就造成下面的問題,0x2300賦給一個布爾類型的時候,布爾類型的值是NO。大家一定要注意這個。
Objective-C中資料類型修飾符
目前位置,我們看到的都是Objective-C中的基礎資料型別 (Elementary Data Type)。在上面的資料類型的基礎上,Objective-C還有一些修飾符來對這些資料類型進行擴張。.
long型
long用來擴充一個資料類型的資料範圍,比如,下面的調用就是擴張了int型的資料:
long int mylargeint;
資料範圍被擴張到何種程度是由系統決定的,所以在很多系統上,long int和int其實一樣的。long同樣可以用來修飾double型:
long double mydouble;
譯者註:long可以在iOS中單獨使用,相當於long int,但是它的大小還是32位的,如果你希望使用64位的資料,請使用long long。
long long型
你可以認為long long是一個更長的long,因此,程式中的long long總是64位的,long long只用來修飾int, long long int和long long相同。
long long int mylargeint;
short型
目前我們看到的都是增加儲存空間的修飾符,那麼相反的也有減少儲存空間的修飾符,short,它只修飾int,short int是一個16位的整形,範圍從−32,768到+32,767:
short int myshort;
有符號和無符號signed / unsigned
預設的,一個整形是有符號的。換句話說,即編譯器會認為一個整形變數會儲存正數,也可能存的是負數。這樣就限制了正負數的範圍,比如,32位的整形的最大值在無符號的時候可以達到4,294,967,295。但是實際中,由於有負數的存在,所以它的範圍就是−2,147,483,648到+2,147,483,647。如果我們知道一個整形從來不會被用來儲存負數,那麼我們可以聲明它為無符號的,就是用unsigned修飾,它的範圍就是0到+4,294,967,295。聲明方式如下:
unsigned int myint;
上面的修飾符可以組合使用,比如聲明一個無符合的短整形:
unsigned short int myint = 10;
注意在unsigned, signed, short和long 修飾整形的時候,關鍵詞int可以省略,下面就是這樣的例子:
short myint;long myint;unsigned myint;signed myint;
小結
Objective-C在基礎資料型別 (Elementary Data Type)方面,是和其他語言一樣的。
譯者註:Objective-C是標準C的擴充,所以基本類型和C語言差不多,不過要注意布爾型,這個類型的定義是在C形成標準以前,所以就形成了現在的這個樣子。