常量在日常开发中用处那是非常的多,那常量应该如何定义呢?
1、宏
宏估计是我们用的最多的一种方式,使用方便。
例如:#define ANIMATION_TIME 10
我们设置动画时间为10秒,在使用时候有ANIMATION_TIME的地方都会被替换成10,请注意替换这个词。
也就是说在编译时候,会将一切宏定义替换成后面的内容。由于宏定义不会检查替换类型,只要遇到就替换。
另外宏可以重复定义,不能保证值不变。
有时候使用宏还会遇到意向不到的结果。宏定义的黑魔法
2、extern、const
创建Constants.h和Constants.m文件用来存放我们的常量。
在Constants.h中,指定常量名字,将常量声明为一个指向NSString对象的指针:
最后,在Constants.m中通过赋值定义常量:
// Constants.m
NSString * const kMyOwnConstant = @"myOwnConstant";
NSString * const kYetAnotherConstant = @“yetAnotherConstant";
使用的时候引入Constants.h便可使用常量了。
这里使用到extern c关键字,表示这个变量已经声明,只是引用。
const关键字表示变量是常量,不可修改。
在objc的约定里,常量也是大小写混排的驼峰命名规则,使用相关类做前缀,首字母小写,另外,第一个字母是k。
如果只是在方法内使用,只需这样定义:
static NSString * const kMyOwnConstant = @“myOwnConstant"
如果不想提供给外部使用则在Constants.h头文件中得声明去掉即可。
注意:
1、在实现文件中使用static const来定义“只在编译单元内可见的常量”(translation-unit-specific constant)。由于此类常量不在全局符号表中,所以无须为其名称加前缀。
2、在头文件中使用extern来声明全局常量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应加以区隔,通常用与之相关的类名做前缀。(Objective-C中const常量是外连接的)
相比宏定义的好处:
1、可以进行指针比较(@”myString” == MyConstant)而不是字符串比较([@”myString” isEqualToString:MyConstant])。前者非常非常快。
2、人总会犯错。所以你就会容易输入错字符串,而编译器并不会抱怨你的语法。但如果使用常量,它就会在你输入错常量名称的时候给予你警告。XCode还会尽最大努力的帮助我们自动完成代码,这些常量也不例外,因此方法会变得非常方便。
名词解释:
extern:extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。来源:百度百科
宏:#define就是“替换”,在编译时,将一切宏定义替换成定义后面的内容。来源:百度百科