iOS开发中枚举与位运算

开发过程中发现很多系统库枚举都是用位运算(<<)的形式进行定义的,如:UIControlEvents,UIControlState等。
下面结合我做的一个枚举说说这样做的好处。
代码如下:

//请求类型
typedef enum {
    NeedTime = 1,
    NeedPubk = 1<<1,
    NeedSign = 1<<2,
    NeedSessionId = 1<<3,
    NeedImei = 1<<4,
    NeedTokenSign = 1<<5,
    AfterLogin = NeedTime|NeedSign|NeedTokenSign|NeedSessionId,//常见的登陆后接口需要参数
    BeferLogin = NeedTime|NeedSign|NeedImei//常见的登陆前接口需要参数
}RequestType;//接口需要参数类型可多选,如:NeedImei|NeedPubk

使用:

+(void)requestWithPath:(NSString *)path
           requestType:(RequestType)requestType
            WithParams:(NSDictionary*)params
      WithSuccessBlock:(requestFinshedBlock)finshed{

    NSMutableDictionary *p = [NSMutableDictionary dictionary];
    
    if (requestType & NeedImei) {
        [p setObject:dataManger.imei forKey:@"imei"];
    }
    if (requestType & NeedTime) {
        [p setObject:[NSDate NowTimestamp] forKey:@"timestamp"];
    }
    if (requestType & NeedPubk) {
        NSString *cPublicKey =@"";
        [p setObject:cPublicKey forKey:@"cPubKey"];
    }
    if (requestType & NeedSessionId) {
        [p setObject:dataManger.sessionId forKey:@"sessionId"];
    }
    if (requestType & NeedSign) {
        if (requestType & NeedTokenSign) {
            [p setObject:dataManger.token forKey:@"token"];
        }
       
        [p setObject:@"signData" forKey:@"data"];
        [p setObject: forKey:@"sign"];
        
        if (requestType & NeedTokenSign) {
            [p removeObjectForKey:@"token"];
        }
    }
  [manger POST:path parameters:p progress:nil success:^(NSURLSessionTask *task, id  responseObject) {
 
    } failure:^(NSURLSessionTask *operation, NSError *error) {
        finshed(NO,nil);
        AppLog(@"%@",error);
    }];
}

网络请求的使用

[LPXNetWork requestWithPath:DoLogin requestType:BeferLogin WithParams:data WithSuccessBlock:^(BOOL success, id  _Nullable responseObject) {
        if(success){
            
        }
    }];

可以看出这里使用的是 BeferLogin

BeferLogin = NeedTime|NeedSign|NeedImei//常见的登陆前接口需要参数

BeferLogin代表了需要时间戳、签名、和设备id。
用“|“运算的形式将NeedTime(00000001)、NeedSign(00000100)、NeedImei(00010000)合并为BeferLogin(00010101)。
这时(requestType & NeedImei)也就是 (BeferLogin &NeedImei)于是 00010101 & 00010000 = 00010000 = 16 = YES。
同理:requestType & NeedTime = YES、requestType & NeedSign = YES

请求的时候BeferLogin的请求类型就会拼接上时间戳、签名、和设备id。
好处是当遇到不常见请求类型是比如只要时间戳和设备id可以直接写NeedTime|NeedImei。这样可以根据需要灵活地进行配置。

当然还有异或等更灵活地用法,暂时还没使用。欢迎评论补充。

你可能感兴趣的:(iOS开发中枚举与位运算)