第四条:多用类型常量,少用# define预处理指令

编写代码时经常要定义常量。例如,要写一个UI视图类,此视图显示出来之后就播放
动画,然后消失。你可能想把播放动画的时间提取为常量。

#define ANIMATION DURATION 0. 3

上述预处理指令会把源代码中的 ANIMATION DURATION字符串替换为0.3,这可能就是你想要的效果,不过这样定义出来的常量没有类型信息。“持续”( duration)这个词看上去应该与时间有关,但是代码中又未明确指出。此外,预处理过程会把碰到的所有ANIMATION DURATION一律替换成03,这样的话,假设此指令声明在某个头文件中,那么所有引入了这个头文件的代码,其 ANIMATION DURATION都会被替换。

下面这行代码就定义了一个类型为 NSTimeInterval的常量

static const NsTimeInterval kAnimationDuration = 0.3;

请注意,用此方式定义的常量包含类型信息,其好处是清楚地描述了常量的含义。

常用的命名法是:

若常量局限于某“编译单元”,也就是“实现文件”, implementation file)之内,则在前面加字母k;若常量在类之外可见,则通常以类名为前缀。

定义常量的位置很重要。我们总喜欢在头文件里声明预处理指令,这样做真的很糟糕,
当常量名称有可能互相冲突时更是如此。例如, ANIMATION DURATION这个常量名就不该用在头文件中,因为所有引入了这份头文件的其他文件中都会出现这个名字。其实就连用 static const定义的那个常量也不应出现在头文件里。

若不打算公开某个常量,则应将其定义在使用该常量的实现文件里。例:

//EOCAnimatedView.h
#import 

@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

公开某个常量,则应将其定义在使用该常量的实现文件里。例:

// In the header file
extern NSString *const EOCStringConstant;

// In the implementation file
NSString *const EOCStringConstant = @"VALUE";

你可能感兴趣的:(第四条:多用类型常量,少用# define预处理指令)