《Effective Objective-C 2.0》3、枚举类型表示状态、选项

简介: 第五条:使用枚举类型表示状态和选项,可以使代码更加清晰,可读性更好。 枚举类型使用关键字enum定义,通常与typedef相结合,定义一组状态或选项: typedef enum CustomState{ CustomStateNon...

第五条:使用枚举类型表示状态和选项,可以使代码更加清晰,可读性更好。

枚举类型使用关键字enum定义,通常与typedef相结合,定义一组状态或选项:

typedef enum CustomState
{
  CustomStateNone,
  CustomStateDefault,
  CustomStateAnother,
} CustomState;

 此后,就可以像内建类型一样使用CustomState定义变量: 

CustomState state = CustomStateDefault;

 

定义枚举型数据时,可以指定每个枚举成员的值,不过该方法一般不常用:

typedef enum CustomState
{
  CustomStateNone = 1,
  CustomStateDefault,
  CustomStateAnother,
} CustomState;

有些时候,可能需要对多个枚举选项同时选定,那么在定义枚举变量时,将每个选项按位进行置1即可:

typedef enum CustomState
{
  CustomStateNone = 1,
  CustomStateDefault = 1<<1,
  CustomStateAnother = 1<<2,
} CustomState;

这样,就可以用按位与的方式选择多个选项:

CustomState state = CustomStateDefault | CustomStateAnother;

在Foundation框架中,定义了两种辅助宏:NS_ENUM和NS_OPTION。使用两个宏定义枚举变量的方法如下:

typedef NS_OPTION(NSUInteger, CustomState)
{
  CustomStateNone = 1,
  CustomStateDefault,
  CustomStateAnother,
} CustomState;
typedef NS_ENUM(NSUInteger, CustomState)
{
  CustomStateNone = 1,
  CustomStateDefault,
  CustomStateAnother,
} CustomState;


二者的区别在于当编译器不按照C++规则进行编译的时候体现。其原因在于,当存在按位或运算时,C++同非C++的处理办法略有不同。如果按照C++模式,那么编译器不允许在枚举中使用宏指定的类型来初始化枚举类型成员。上面使用NS_ENUM定义的枚举展开方式如:
typedef enum CustomState: NSUInteger CustomState;
enum CustomState
{
 CustomStateNone = 1;
 CustomStateDefault = 1<<1;
 CustomStateAnother = 1<<2;
}

此时若存在以下调用:
CustomState state = CustomStateNone | CustomStateDefault;

那么当使用C++编译时将出现无法使用int类型初始化CustomState类型的错误。因此当存在按位或操作对多个选项进行组合的情况下,应使用NS_OPTION宏来定义枚举类型,如:
typedef NS_OPTION(NSUInteger, CustomState)
{
  CustomStateNone = 1,
  CustomStateDefault = 1<<1,
  CustomStateAnother = 1<<2,
} CustomState;



目录
相关文章
|
iOS开发 开发者 C++
Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7
Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7 Chapter 5 内存管理 Tips 29 理解引用计数 引用计数是 Objective-C 内存管理的基础,包括 ARC 也是建立在引用计数的基础之...
1256 0
|
安全 iOS开发 编译器
Effective Objective-C 2.0
本书是iOS开发进阶的必读书籍之一。文中部分名词的中文翻译略坑,比如对block和GCD的翻译。其他整体还好,原作者写的比较用心。代码规范讲了不少,底层原理讲了一点点,且主要集中在第二章。
1351 0
|
安全 iOS开发 编译器
Effective Objective-C 2.0 Tips 总结 Chapter 3 & Chapter 4
Chapter 3 接口与 API 设计 Tips 15 使用前缀避免明明空间冲突 Objective-C 没有命名空间,所以我们在起名时要设法避免命名冲突 避免命名冲突的方法就是使用前缀 应用中的所有名称都需要加前缀(包括实现文件中的全局变量和...
1064 0
|
iOS开发 编译器 C语言
Effective Objective-C 2.0 Tips 总结 Chapter 1 & Chapter 2
下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更佳。
1127 0
|
iOS开发 编译器 自然语言处理
《Effective Objective-C 2.0》2、数据的定义方法
第三条:多用字面量语法,少用等价的方法 这部分所描述的是创建foundation类的对象时的技巧。Foundation框架是iOS中至关重要的框架,iOS应用中大部分数据都可以用foundation类表示。
993 0
|
C++ iOS开发 编译器
《Effective Objective-C 2.0》1、熟悉Objective-C
该系列是《Effective Objective-C 2.0——编写高质量iOS与OS X代码的52个有效方法》的读书笔记。 第一条:了解Objective-C语言的起源 同C++类似,Objective-C也是C语言进行面相对象化的扩展。
972 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
93 2
|
3月前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
67 0
|
机器学习/深度学习 API iOS开发
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
140 0
|
存储 自然语言处理 Java
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
218 0