iOS - OC Enum 列舉

weixin_34119545發表於2016-08-17

前言

  • iOS 5.0 之後,提供了新的列舉定義方式,定義列舉的同時,可以指定列舉中資料的型別。

        typedef NS_OPTIONS(_type, _name) new;   -> 位移的,可以使用 按位或 設定數值
        typedef NS_ENUM(_type, _name) new;      -> 數字的,直接使用列舉設定數值
  • 位移型列舉:

    • 使用 按位或 可以給一個引數同時設定多個 "型別"。在具體執行的時候,使用 按位與 可以判斷具體的 "型別"。
    • OC 中 64 位作業系統 NSInteger 64 位 - long => 能夠表示 64 種選項。通過位移設定,就能夠得到非常多的組合。
    • 對於位移列舉型別,如果傳入 0,表示什麼附加操作都不做!=> 執行效率是最高的。如果開發中,看到位移的列舉,同時不要做任何的附加操作,引數可以直接輸入 0!

1、列舉的定義

1.1 C 樣式列舉定義

  • 定義列舉型別

        /*
            typedef enum new;
    
            new:列舉型別的變數值列表
    
            C 樣式的列舉預設列舉型別變數值的格式為整型
        */
    
        typedef enum {
    
            AA,
            BB,
            CC
    
        } Name;
  • 判斷列舉值

        - (void)studentWithName:(Name)name {
    
            switch (name) {
    
                case 0:
    
                    NSLog(@"AA");
                    break;
    
                case 1:
    
                    NSLog(@"BB");
                    break;
    
                case 2:
    
                    NSLog(@"CC");
                    break;
    
                default:
                    break;
            }
        }
  • 設定列舉的值

        [self studentWithName:1];
    
        [self studentWithName:CC];

1.2 數字型列舉定義

  • 定義列舉型別

        /*
            typedef NS_ENUM(_type, _name) new;                      
    
            _type:列舉型別變數值的格式
            _name:列舉型別的名字
            new:列舉型別的變數值列表
        */
    
        typedef NS_ENUM(NSUInteger, Seasons) {
    
            spring = 0,
            summer,
            autumn,
            winter
        };
  • 判斷列舉值

        - (void)selectWithSeasons:(Seasons)seasons {
    
            if (seasons == 1 || seasons == 2) {
    
                NSLog(@"comfortable");
    
            } else {
    
                NSLog(@"cold");
            }
        }
  • 設定列舉的值

        [self selectWithSeasons:0];
    
        [self selectWithSeasons:autumn];

1.3 位移型列舉定義

  • 定義列舉型別

        /*
            typedef NS_OPTIONS(_type, _name) new;
    
            _type:列舉型別變數值的格式
            _name:列舉型別的名字
            new:列舉型別的變數值列表
    
            位移的列舉判斷不能使用 else,否則會丟選項
        */
    
        typedef NS_OPTIONS(NSUInteger, ActionTypeOptions) {
    
            ActionTypeTop =     1 << 0,
            ActionTypeBottom =  1 << 1,
            ActionTypeLeft =    1 << 2,
            ActionTypeRight =   1 << 3
        };
  • 判斷列舉值

        - (void)movedWithActionType:(ActionTypeOptions)type {
    
            if (type == 0) {
                return;
            }
    
            if (type & ActionTypeTop) {
                NSLog(@"上 %li", type & ActionTypeTop);
            }
            if (type & ActionTypeBottom) {
                NSLog(@"下 %li", type & ActionTypeBottom);
            }
            if (type & ActionTypeLeft) {
                NSLog(@"左 %li", type & ActionTypeLeft);
            }
            if (type & ActionTypeRight) {
                NSLog(@"右 %li", type & ActionTypeRight);
            }
        }
  • 設定列舉的值

        [self movedWithActionType:0];
    
        [self movedWithActionType:ActionTypeLeft | ActionTypeTop | ActionTypeBottom | ActionTypeRight];

相關文章