美文网首页iOS开发随手笔记
三分钟学会枚举的正确用法

三分钟学会枚举的正确用法

作者: 择势量投 | 来源:发表于2018-04-18 15:40 被阅读8次

前言

   Enum,枚举,相信大部分编程语言都有对应的枚举类型,功能可能有多有少,但是枚举最核心的功能是 “规范的定义代码中的状态、状态码、选项”。

状态、状态码、选项

   什么是状态:同时只能出现一个值(状态码就是他的值),比如这个ScrollView里的枚举:

typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {
    UIScrollViewKeyboardDismissModeNone,
    UIScrollViewKeyboardDismissModeOnDrag,          
    UIScrollViewKeyboardDismissModeInteractive
};

什么是选项:同时可以出现一个或多个值:

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
        UIViewAutoresizingNone                 = 0,
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
        UIViewAutoresizingFlexibleWidth        = 1 << 1,
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
        UIViewAutoresizingFlexibleHeight       = 1 << 4,
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

为什么要使用NS_ENUM(状态) 和 NS_OPTIONS(选项)?

以上的都不重要,看我的证明就行了。

状态的表示姿势

错误姿势

#define UIScrollViewKeyboardDismissModeOnDrag 1          
#define UIScrollViewKeyboardDismissModeInteractive 2
// 接收值就得这样:
int UIScrollViewKeyboardDismissMode = UIScrollViewKeyboardDismissModeNone;

为什么这样做不好:

  • 宏定义没有类型约束,只是单纯的替换。
  • 可以用int也可以用UIInteger来接收。
  • 可读性较差。

正确姿势

typedef enum {
    UIScrollViewKeyboardDismissModeNone = 0,
    UIScrollViewKeyboardDismissModeOnDrag,          
    UIScrollViewKeyboardDismissModeInteractive
} UIScrollViewKeyboardDismissMode;

// 指明枚举类型
UIScrollViewKeyboardDismissMode mode = UIScrollViewKeyboardDismissModeNone;

typedef enum {
    UIScrollViewKeyboardDismissModeNone = 0,
    UIScrollViewKeyboardDismissModeOnDrag,          
    UIScrollViewKeyboardDismissModeInteractive
} UIScrollViewKeyboardDismissMode;
 
// 指明枚举类型
UIScrollViewKeyboardDismissMode mode = UIScrollViewKeyboardDismissModeNone;

用起来就是这样的:

- (void)dealWithMode:(UIScrollViewKeyboardDismissMode)mode {
    switch (mode) {
        case UIScrollViewKeyboardDismissModeNone:
            //...
            break;
        case UIScrollViewKeyboardDismissModeOnDrag:
            //...
            break;
        case UIScrollViewKeyboardDismissModeInteractive:
            //...
            break;
    }
}

这样枚举解决了上面1和2的缺点,但是第3点还是没有解决,我依然可以这样搞:

int mode = UIScrollViewKeyboardDismissModeNone;
// or
UIInteger mode = UIScrollViewKeyboardDismissModeNone;

完美姿势

NS_ENUM是枚举在Objective-C中的”升级版”,改进后代码如下:

typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {
    UIScrollViewKeyboardDismissModeNone,
    UIScrollViewKeyboardDismissModeOnDrag,          
    UIScrollViewKeyboardDismissModeInteractive
};

代码很简单,不理解的话可以评论求解答。

选项的使用姿势

如果有一个”选项变量”要同时表示一个或者多个值肿么办?这时就得上我们的NS_OPTIONS了。
比如有这样一个简单的例子:

typedef NS_OPTIONS(NSUInteger, JZZPersonType) {
        JZZPersonTypeHigh          = 0,
        JZZPersonTypeRich          = 1 << 0,
        JZZPersonTypePretty        = 1 << 1
};

可以看到,我们这里的选项是用的位运算的方式定义的,这样的好处就是我们的选项变量可以这样来表示:

// 用“或|”运算同时赋值多个选项
JZZPersonType personType = JZZPersonTypeHigh | JZZPersonTypeRich | JZZPersonTypePretty;

// 用“与&”运算取出对应位
if (personType & JZZPersonTypeHigh) {
    NSLog(@"高");
}
if (personType & JZZPersonTypeRich) {
    NSLog(@"富");
}
if (personType & JZZPersonTypePretty) {
    NSLog(@"帅");
}

“|”赋值完后,富帅的内心(内存)其实是长这样的:


2016-05-222016-05-22-1.png

相关文章

  • 三分钟学会枚举的正确用法

    前言    Enum,枚举,相信大部分编程语言都有对应的枚举类型,功能可能有多有少,但是枚举最核心的功能是 “规范...

  • swift 枚举便利的高阶用法

    枚举遍历的高级用法 枚举遍历方法2

  • Swift中枚举的内存布局

    枚举 枚举的基本用法 关联值(Associated Values) 原始值(Raw Values) 枚举成员可以使...

  • iOS-Swift-枚举

    Swift中的枚举比OC中的枚举更强大。 一. 枚举的基本用法 二. 关联值(Associated Values)...

  • swift语法记录-之枚举

    枚举的基本用法 在C,OC中,枚举就是整形,0,1,2,3...在swift中的基本用法 关联值(Associat...

  • 枚举

    枚举 wiki Java的枚举类型用法介绍 深入理解Java枚举类型(enum) 为什么要用enum? 学习计划 ...

  • Java中枚举Enum的实际应用

    简书 Wwwwei转载请注明原创出处,谢谢! Java枚举7种常见用法 Java枚举7种常见用法 举个例子 需求 ...

  • swift基础——枚举

    枚举的基本用法 枚举的名称建议大写开头,成员名小写开头 枚举定义 枚举值使用 关联值 有时会将枚举的成员值跟其他类...

  • 七、枚举类型 可选项

    枚举 枚举基本用法 不同于C/OC,枚举成员不会分配默认的整数值当变量已确定为枚举类型,再次赋值可省略 枚举关联值...

  • Kotlin 枚举类

    枚举类最基本的用法是实现一个类型安全的枚举。枚举常量用逗号分隔,每个枚举常量都是一个对象。 相关属性、方法 枚举类...

网友评论

本文标题:三分钟学会枚举的正确用法

本文链接:https://www.haomeiwen.com/subject/fxovkftx.html