在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1: 多用类型常量, 少用 #define 预处理指令 #define 预处理指令会把碰到的所有 指定名称 一律换位 定义的内容, 这样的话, 假设此指令在某个头文件中, 那么所有引入这个头文件的代码, 都会被替换 解决这个问题, 有一个办法 static const NSString * name = @"name"; 请注意,用此方式定义的常量包含类型信息, 器好处是清除地描述了常量的含义, 还要注意常量名称, 常量命名的方法是: 若常量局限于 "编译单元", 也就是实现文件, 即 .m 文件里面, 则在前面加字幕 k. 若常量在类之外可见, 则通常以类名为前缀
定义常量的位置很重要, 我们总习惯在头文件里声明 预处理指令, 这样所有引入这份头文件的其他文件都会出现这个 预处理指令, 就是用static const 定义的常量也不应该出现在头文件中, 正确的做法是, 若不打算公开某个常量, 则应该将其定义在使用该常量的实现文件里面, 在 @implemantation xxxxxxxx 上方写. 而用 static 修饰符则意味着该白能量仅在定义变量的编译单元中可见, 加入声明次变量时不加 static ,此时若是另一个编译单元中也声明了 同名变量, 编辑器就会报错 有时候需要对外公开某个常量, 应该这样来定义 在 头文件中,即 .h 文件 extern NSString*const XXXXXX; 在 实现文件中, 即 .m 文件 NSString *const XXXXXX = @"xxxxxx"; 这个常量在头文件中 声明, 且在实现文件中定义, //这样定义常量要由于使用 #define 预处理指令, 因为编译器会确保常量值不变,
总结 : 不要用预处理指令定义吃那个两, 这样定义出来的常量不包含类型信息, 编译器只是在编译前据此执行查找与替换操作, 即使有人冲洗定义了常量值, 编译器也不会产生警告信息,这将导致应用程序的常量值不一致. 在实现文件中使用 static const 来定义 只在编译单元可见的常量 , 由于此类常量不在全局单元符号表中, 所以无需为其名称加前缀 在头文件中使用 extern 来声明全局变量, 并在相关实现文件中定义其值, 这种常量要出现在全局符号表中, 所以其名称应加区隔, 通常用用户只相关的类名做前缀
2: 用枚举表示状态. 选项. 状态码 例如: enum AAAAAA{ aaaaaa, bbbbbb, ccccccc };
枚举只是一种常量的命名方式, 编辑器回味枚举分配一个独有的编号, 从 0 开始, 每个枚举递增 1, 定义枚举变量的方式 enum AAAAAA state = cccccc;
若想每次不同敲入 enum 而只需要写 AAAAAA, 则需要使用 typedef 关键字重新定义枚举类型,如下: enum AAAAAA{ aaaaaa, bbbbbb, ccccccc }; typedef enum AAAAAA AAAAAA; 现在可以使用 AAAAAA state = cccccc;
// C++11 标准修订了枚举的某些特性, 其中一项改动是 ' : ' , 可以指明用何种 "底层数据类型" 来保存枚举类型的变量 语法是: enum AAAAAA : NSInteger { aaaaaa, bbbbbb, cccccc };
Foundation 框架中定义了一些辅助的宏, 用这些宏来定义枚举类型时, 也可以指定用于保存枚举值的底层数据类型, 这些宏具备向后兼容性, 如果目标平台的编译器支持新标准, 那就使用新式语法, 否则就改用旧时语法,
这些宏是用 #define 预处理指令来定义的, 其中一个用于定义 普通的枚举类型, 另一个用于定义像 UIViewAutoresizing 这种包含一系列选项的枚举类型, 这种用法不常用. 两种用法如下: typedef NS_ENUM (NSInteger ,AAAAAA){ aaaaaa, bbbbb, cccccc };
typedef NS_OPTIONS(NSUInteger , AAAAAA){ };
最后还有一种枚举的用法, 就是在 switch 语句里, 我们总习惯 在 switch 语句中加上 default 分支, 然而, 若是用枚举来定义状态机, 则最好不要有 default 分支, 这样的话, 如果稍后有增加了一种状态, 那么编译器就会发出警告信息, 提示新加入的状态并未在 switch 分支中处理, 加入写上了 default 分支, 它就会处理这种新状态, 从而导致编译器不发警告信息, 同样, 用 NS_ENUM 定义其他枚举类型时也要注意此问题
总结: 应该用枚举来表示状态机的状态, 传递给方法的选项以及状态码等值, 给这些值起一个简单易懂的名字. 用 NS_ENUM 与 NS_OPTIONS 宏来定义枚举类型, 并指明其底层数据类型, 这样做可以确保枚举使用开发者所选的底层数据类型实现出来的, 而不是采用编译器所选的类型 在处理枚举类型的 switch 语句中不要实现 default 分支, 这样,加入新的枚举值时, 编译器就会提示开发者, switch 语句并未处理所有枚举. |
请发表评论