美文网首页
新知篇之一--枚举

新知篇之一--枚举

作者: 好雨知时节浩宇 | 来源:发表于2018-02-07 11:19 被阅读21次

    目前开发中常用的枚举有两种:NS_ENUM 和NS_OPTIONS 。
    不做过多铺垫,我们单刀直入,直接讲二者区别和用法。
    1、定义:
    NS_ENUM:普通枚举 、NS_OPTIONS:位移枚举
    2、语法形式:
    NS_ENUM :

    typedef NS_ENUM(NSInteger, NSWritingDirection) {
        NSWritingDirectionNatural = 0,     
        NSWritingDirectionLeftToRight,  
        NSWritingDirectionRightToLeft       
    };
    
    

    NS_OPTIONS :

    typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
        UISwipeGestureRecognizerDirectionNone = 0,  //值为0
        UISwipeGestureRecognizerDirectionRight = 1 << 0,  //值为2的0次方
        UISwipeGestureRecognizerDirectionLeft = 1 << 1,  //值为2的1次方
        UISwipeGestureRecognizerDirectionUp = 1 << 2,  //值为2的2次方
        UISwipeGestureRecognizerDirectionDown = 1 << 3  //值为2的3次方
    };
    

    **注意区别:通常来讲普通枚举使用的是NSIterger,而NS_OPTIONS使用NSUInterger。原因,感兴趣同学可自行查阅。

    3、如何使用:
    通常来讲当有多个枚举值同时存在时,可以使用NS_OPTIONS。
    例如:

    UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizer alloc] init];
    swipeGR.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
    
    

    而NS_ENUM定义的枚举不能几个枚举项同时存在,只能选择其中一项。

    4、位移枚举的运算:

    //定义一个位移枚举
    typedef NS_OPTIONS(NSUInteger, MyOption)  {
    MyOptionNone = 0, //二进制0000,十进制0
    MyOption1 = 1 << 0, //0001,1
    MyOption2 = 1 << 1, //0010,2
    MyOption3 = 1 << 2, //0100,4
    MyOption4 = 1 << 3, //1000,8
    };
    
    //使用:判断、总结、移除枚举值
    //声明定义枚举变量
    MyOption option = MyOption1 | MyOption2; //0001 | 0010 = 0011,3
    
    //检查是否包含某选型
    if ( option & MyOption3 ) { //0011 & 0100 = 0000  通过位或运算来判断是否包含
         //包含MyOption3
    }
    else {
         //不包含MyOption3
    }
    
    //增加选项:
    option = option | MyOption4;  //0011 | 1000 = 1011, 11
    //减少选项
    option = option & (~MyOption4); //1011 & (~1000) = 1011 & 0111 = 0011, 3
    
    

    位移枚举是通过位或运算来实现:判断、增加、减少对应枚举值的

    5、实际使用:SDWebImageDownloader中通过使用位移枚举提供多项可选操作。

    if ((!cachedImage || options & SDWebImageRefreshCached) && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url])) {
                if (cachedImage && options & SDWebImageRefreshCached) {
                    // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image
                    // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server.
                    [self callCompletionBlockForOperation:weakOperation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url];
                }
    
                // download if no image or requested to refresh anyway, and download allowed by delegate
                SDWebImageDownloaderOptions downloaderOptions = 0;
    //NOTE:Haoyu - 判断options中是否包含SDWebImageLowPriority枚举项,如包含,则将SDWebImageDownloaderLowPriority枚举值添加到downloaderOptions中。
                if (options & SDWebImageLowPriority) downloaderOptions |= SDWebImageDownloaderLowPriority;
                if (options & SDWebImageProgressiveDownload) downloaderOptions |= SDWebImageDownloaderProgressiveDownload;
                if (options & SDWebImageRefreshCached) downloaderOptions |= SDWebImageDownloaderUseNSURLCache;
                if (options & SDWebImageContinueInBackground) downloaderOptions |= SDWebImageDownloaderContinueInBackground;
                if (options & SDWebImageHandleCookies) downloaderOptions |= SDWebImageDownloaderHandleCookies;
                if (options & SDWebImageAllowInvalidSSLCertificates) downloaderOptions |= SDWebImageDownloaderAllowInvalidSSLCertificates;
                if (options & SDWebImageHighPriority) downloaderOptions |= SDWebImageDownloaderHighPriority;
                if (options & SDWebImageScaleDownLargeImages) downloaderOptions |= SDWebImageDownloaderScaleDownLargeImages;
                
                if (cachedImage && options & SDWebImageRefreshCached) {
                    // force progressive off if image already cached but forced refreshing  移除某项枚举值
                    downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload;
                    // ignore image read from NSURLCache if image if cached but force refreshing
                    downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse;
                }
    
    

    注:上述代码中用到了:|= 和 &= ~ ,二者分别等价于:options = options | SDWebImageDownloaderoptions = options & ( ~SDWebImageDownloader)

    6、总结:
    两种方式同为枚举,根据不同需求,我么可以分别采用不同的枚举。二者都较为常见,但通常来讲大家只会用NS_ENUM方式,对NS_OPTIONS会陌生一些,在阅读源码时,我们经常会遇到NS_OPTIONS这种枚举方式。而且很有用,所以需要掌握该部分知识点。

    相关文章

      网友评论

          本文标题:新知篇之一--枚举

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