美文网首页
iOS开发中枚举与位运算

iOS开发中枚举与位运算

作者: 木_穆 | 来源:发表于2019-01-05 22:40 被阅读0次

开发过程中发现很多系统库枚举都是用位运算(<<)的形式进行定义的,如: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开发中枚举与位运算

    开发过程中发现很多系统库枚举都是用位运算(<<)的形式进行定义的,如:UIControlEvents,UICont...

  • iOS 位枚举

    在 iOS 开发中,我们使用系统的枚举定义的时候,经常可以看到位枚举: 需要掌握位枚举,我们需要先了解位运算 和 ...

  • 位运算

    在iOS开发中位运算多使用到枚举中,其他地方运用的相对较少。项目中合理的运用位运算能提高我们代码的执行效率。 一、...

  • 位运算与位枚举

    位运算与位枚举

  • ios高效开发

    ios高效开发-正确的使用枚举(Enum) Objective-C位运算符 堆栈的工作原理 沙盒目录结构解析 Ob...

  • [iOS] 枚举 位运算的转换

    封装工具时, 使用不能定位第三方的枚举比如 SDWebImage 所以 外部定义枚举 内部转换 相关文章 iOS开...

  • iOS开发-位运算

    http://www.jianshu.com/p/36ba5d65804f

  • iOS开发-位运算

    前言 从现代计算机电路来说,只有高电平/低电平两种状态,即为0/1状态,计算机中所有的数据按照具体的编码格式以二进...

  • iOS-枚举类型为什么要用<<

    在枚举中我们经常看到<<这样的位运算符。如果我们在枚举中看到<<那我们就可以通过|(位运算符:或)进行组合使用: ...

  • IOS中的位移枚举与按位运算(OC、Swift)

    说起位移枚举,首先了解两个运算符“&”和“|”,不同于“||” “&&”按位与 & :顾名思义要按照对应所在的位...

网友评论

      本文标题:iOS开发中枚举与位运算

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