资讯专栏INFORMATION COLUMN

iOS开发中定义枚举的正确姿势(NS_ENUM VS enum)

jerryloveemily / 2207人阅读

摘要:开发中枚举也是经常会用到的数据类型之一。而且我们查看苹果的框架,发现苹果使用的也是第三种和第四种。总结结合和苹果官方的说明,我们以后在定义枚举时,应该使用和,这样更规范。

iOS开发中枚举也是经常会用到的数据类型之一。最近在整理别人写的老项目的时候,发现枚举的定义使用了多种方式。

方式1

typedef enum {
    MJPropertyKeyTypeDictionary = 0, // 字典的key
    MJPropertyKeyTypeArray // 数组的key
} MJPropertyKeyType;

方式2

typedef enum: NSInteger {
        None,
        Melee,
        Fire,
        Ice,
        Posion
    }AttackType;

方式3

typedef NS_ENUM(NSUInteger, MeiziCategory) {
    MeiziCategoryAll = 0,
    MeiziCategoryDaXiong,
    MeiziCategoryQiaoTun,
    MeiziCategoryHeisi,
    MeiziCategoryMeiTui,
    MeiziCategoryQingXin,
    MeiziCategoryZaHui
};

方式4

这种比较特殊支持位操作

typedef NS_OPTIONS(NSUInteger, ActionType) {
    ActionTypeUp    = 1 << 0, // 1
    ActionTypeDown  = 1 << 1, // 2
    ActionTypeRight = 1 << 2, // 4
    ActionTypeLeft  = 1 << 3, // 8
};

针对于前三种方式,我们应该使用那一种更新好呢?
这是来自Stack Overflow的解释。

First, NS_ENUM uses a new feature of the C language where you can specify the underlying type for an enum. In this case, the underlying type for the enum is NSInteger (in plain C it would be whatever the compiler decides, char, short, or even a 24 bit integer if the compiler feels like it).

Second, the compiler specifically recognises the NS_ENUM macro, so it knows that you have an enum with values that shouldn"t be combined like flags, the debugger knows what"s going on, and the enum can be translated to Swift automatically.

翻译:

首先,NS_ENUM使用C语言的一个新特性,您可以在该特性中指定enum的底层类型。在本例中,enum的底层类型是NSInteger(在普通的C语言中,它是编译器决定的任何类型,char、short,甚至是编译器喜欢的24位整数)。

其次,编译器专门识别NS_ENUM宏,因此它知道您有一个enum,它的值不应该像标志那样组合在一起,调试器知道发生了什么,并且enum可以自动转换为Swift。

从解释可以看出,定义普通的枚举时,推荐我们使用第三种方式 NS_ENUM(),定义位移相关的枚举时,我们则使用 NS_OPTIONS()

而且我们查看苹果的框架,发现苹果使用的也是第三种和第四种。苹果的官方文档也有明确的说明,推荐我们使用NS_ENUM()NS_OPTIONS()

总结:结合Stack Overflow和苹果官方的说明,我们以后在定义枚举时,应该使用NS_ENUM()NS_OPTIONS(),这样更规范。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17317.html

相关文章

  • iOS开发手册

    摘要:常量根据作用域适当加上前缀含项目前缀可供外部使用需加上相应的类名或者模块前缀,仅文件内部使用需要加上小写字母宏定义每个字母采用大写,单词之间用下划线间隔。宏定义也可根据作用范围加上适当前缀,避免命名冲突。 声明: 本文档面向以Objective-C作为开发语言的iOS团队。 本文档以苹果开发文档为基础,结合网络内容和开发实践进行整理,针对iOS开发进行规范和约定。 最后更新时间:20...

    GHOST_349178 评论0 收藏0
  • iOS蓝牙开发CoreBlueTooth库核心方法使用介绍

    摘要:相关的蓝牙操作由专门的进行统一管理。通过蓝牙进行通讯交互分为两方,一方为中心设备,一方为外设,外设通过广播的方式向外发送信息,中心设备检索到外设发的广播信息,可以进行配对连接,进而进行数据交互。 一、引言 蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单。相关的蓝牙操作由专门的 CoreBluetooth.framework进行统一管理。通...

    Keagan 评论0 收藏0
  • Raw​Option​Set​Type

    原文链接:http://nshipster.com/rawoptionsettype/ 用法 OC中用NS_ENUM & NS_OPTIONS用来标记C中的枚举值。 在Swift中,即使因为增加了许多特性让枚举显得比较费事比如原始值和关联值等,枚举仍然以第一类语言的身份与struct or class并驾齐驱成为基石。枚举完全的契合使用于封装一套关系相近的固定值集合,开发可以有很多机会来使用它...

    shaonbean 评论0 收藏0
  • 使用 EventKit 向系统日历添加事件

    摘要:使用向系统日历中添加事件本文主要内容是如何一步一步使用在设备中添加日历,并在日历中添加事件和提醒事项。每一个拥有独一无二的标识,是每个事件的,这个字符串是应用自己分配的,保证了每个应用可以在添加了事件以后,针对性的进行事件修改。 使用 EventKit 向系统日历中添加事件 本文主要内容是如何一步一步使用EventKit在iOS设备中添加日历,并在日历中添加事件和提醒事项。 源代码...

    yck 评论0 收藏0
  • [分享]iOS开发-实现带输入框AlertView及设置键盘样式方法

    摘要:对于带输入框的弹出框在及以上版本,有一种较为简单的实现方式,即设置的属性即可。可供设置的属性如下,为默认值,不带输入框为密码型输入框,输入的字符显示为圆点儿为明文输入框,显示输入的实际字符为用户名,密码两个输入框,一个明文,一个密码。 对于带输入框的弹出框(UIAlertView),在IOS5.0及以上版本,有一种较为简单的实现方式,即设置UIAlertView的alertViewSt...

    wmui 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<