編寫(xiě)代碼時(shí)經(jīng)常要定義常量。例如,要寫(xiě)一個(gè)UI視圖類,此視圖顯示出來(lái)之后就播放
動(dòng)畫(huà),然后消失粘我。你可能想把播放動(dòng)畫(huà)的時(shí)間提取為常量。
#define ANIMATION DURATION 0. 3
上述預(yù)處理指令會(huì)把源代碼中的 ANIMATION DURATION字符串替換為0.3,這可能就是你想要的效果,不過(guò)這樣定義出來(lái)的常量沒(méi)有類型信息痹换≌髯郑“持續(xù)”( duration)這個(gè)詞看上去應(yīng)該與時(shí)間有關(guān),但是代碼中又未明確指出。此外,預(yù)處理過(guò)程會(huì)把碰到的所有ANIMATION DURATION一律替換成03,這樣的話,假設(shè)此指令聲明在某個(gè)頭文件中,那么所有引入了這個(gè)頭文件的代碼,其 ANIMATION DURATION都會(huì)被替換娇豫。
下面這行代碼就定義了一個(gè)類型為 NSTimeInterval的常量
static const NsTimeInterval kAnimationDuration = 0.3;
請(qǐng)注意,用此方式定義的常量包含類型信息,其好處是清楚地描述了常量的含義匙姜。
常用的命名法是:
若常量局限于某“編譯單元”,也就是“實(shí)現(xiàn)文件”, implementation file)之內(nèi),則在前面加字母k;若常量在類之外可見(jiàn),則通常以類名為前綴。
定義常量的位置很重要冯痢。我們總喜歡在頭文件里聲明預(yù)處理指令,這樣做真的很糟糕,
當(dāng)常量名稱有可能互相沖突時(shí)更是如此氮昧。例如, ANIMATION DURATION這個(gè)常量名就不該用在頭文件中,因?yàn)樗幸肓诉@份頭文件的其他文件中都會(huì)出現(xiàn)這個(gè)名字或详。其實(shí)就連用 static const定義的那個(gè)常量也不應(yīng)出現(xiàn)在頭文件里。
若不打算公開(kāi)某個(gè)常量,則應(yīng)將其定義在使用該常量的實(shí)現(xiàn)文件里郭计。例:
//EOCAnimatedView.h
#import <UIKit/UIKit.h>
@interface EOCAnimatedView : UIView
- (void)animate;
@end
//EOCAnimatedView.m
#import "EOCAnimatedView.h"
static const NSTimeInterval kAnimationDuration = 0.3;
@implementation EOCAnimatedView
- (void)animate{
[UIView animateWithDuration:kAnimationDuration
animations:^( ){
//perform animations
}];
}
@end
公開(kāi)某個(gè)常量,則應(yīng)將其定義在使用該常量的實(shí)現(xiàn)文件里。例:
// In the header file
extern NSString *const EOCStringConstant;
// In the implementation file
NSString *const EOCStringConstant = @"VALUE";