顯示具有 Objective-C 標籤的文章。 顯示所有文章
顯示具有 Objective-C 標籤的文章。 顯示所有文章

2014年1月25日 星期六

#define 敘述

#define 最常見的用法是指定一個符號名稱(symbolic name)給程式中的常數,
ex.
#define PI    3.1415926

定義符號名稱 PI,並讓它等同於 3.14。

在程式中只要出現 PI 的地方,前端處理程式會自動將 PI 取代為定義 3.14。

#define 敘述有個特殊的語法:將 3.14 指定給 PI 時,不會用到等號,在句尾也沒有分號。(稍後說明)

#define 敘述通常宣告在程式的一開始處,且位於 #import or #include 敘述之後,
放置的位置沒有硬性規定,但一定要置於程式被引用前。
大部份的程式設計師會將 #define 敘述置於標頭檔,如此名稱便能被多個原始檔(source file)使用。

使用 #define 敘述的好處是:

1. 我們不必在每次需要用到常數時,記得該常數值。
2. 若要修改該常數,只要在 #define 敘述裡修改即可。
   若不用這個方法,則需要搜尋整個程式,並且在每個使用該常數的地方加以修改。

命名習慣:

一般程式設計師習慣將符號名稱以大寫表示,
ex.
#define PI      3.14#define TRUE    1
#define FALSE   0

這是為了要與變數的定義作區隔,如此便能輕易的分辨,一個名稱代表的是物件、class name、或是 symbolic name。

也有個通俗的習慣,使用 k 作為定義的前置詞,在此情況,命名就不需要全大寫,
ex.
#define kMaximumValue    100
#define kMiniimumValue   1

進階的形態定義:

符號名稱的定義不只限於一個常數,還可以包含一個運算式,
ex.
#define TWO_PI  2.0 * 3.1415926

前端處理程式將置換所有出現的符號名稱,這也就是為什麼不以分號做結束的原因。
若用了分號會變成:

#define PI  3.1415926;

return 2.0 * PI * r;

編譯器看到的是:

return 2.0 * 3.1415926; * r;

而造成語法上的錯誤,
所以請記得不要在 #define 敘述字尾加上分號,除非確定分號就是敘述的一部份。

對前端處理程式定義來說,只要代替的運算式是有效即可。
ex.
#define AND &&
#define OR  ||

便可撰寫以下程式:
if (x == 0 OR x == value) {    //...
}

甚至也可將 #define 用在相等的比較

#define EQUALS  ||

接著撰寫以下敘述:

if (x == 0 EQUALS x == value) {    //...
}

這可免除在相等的測試裡誤用單一等號的可能性。

雖然以上範例描述了 #define 敘述的優點,但要注意,若重新定義語言中已知的語法,並不是個撰寫程式的好習慣,
這會使人更難看懂你的程式。


前端處理程式

前端處理程式(Preprocessor)可以讓我們更容易的開發、閱讀、修改程式,以及在不同的系統間移植。
前端處理程式是 Objective-C 編譯的一部份,它能識別在程式中出現的特殊敘述。
它會在分析程式之前,處理這些敘述。
前端處理程式敘述是由井字號(#)加以識別,井字號必須是該行第一個非空白字元。

Const 關鍵字

關鍵字 const 用來定義常數(constant),
必須建立時同時給予初值。 
以 const 宣告後的變數設定初值後,
都不能重新指派新的值 。




2013年4月9日 星期二

型別轉換

整數(或浮點數)轉成字串,用 NSString 的 stringWithFormat 就作得到了
(改成 %f 或 %g 就可以把浮點數轉成字串):

NSString *myNewString = [NSString stringWithFormat:@"%i", myValue];



至於字串轉成整數或浮點數,可以用 NSString 中的 intValue 、floatValue 和 doubleValue 等方法進行:

double myDouble = [myString doubleValue];



以下是把浮點數轉成最接近的整數方法:

int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5));