ObjC中語法糖的趣味應用

DR_Kun發表於2018-09-13

OC 中語法糖應用形式一般如下:

self.bgView = ({
    UIView *view = [[UIView alloc] init];
    view.layer.cornerRadius = 5;
    view.layer.masksToBounds = YES;
    view.backgroundColor = self.layout.searchBGColor;
    [self addSubview:view];
    view;
});
複製程式碼

這裡語法糖的使用有利於把程式碼集中便於閱讀;

通過對上面語法糖的觀察我們可以得出在 ({}) 中,只需要在 {} 的最後一行返回一個 value 即可(我們是不是應該認為 ({}) 的本質是一個 表示式 ),那麼我們就可以做一些有意思的事情了:

  1. 基本資料型別中使用 ({}) ,如下

    module.totalHeight = ({
        128.0;
    });
    複製程式碼
  2. 三目運算子中

    例如在 -tableView:heightForRowAtIndexPath: 中我們使用 model 進行快取 cell 高度時一般情況程式碼會這樣:

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        APNTaskListModel *module = _data[indexPath.row];
        if (module.totalHeight < 1.0) {
            module.totalHeight = [APNTaskListCell defaultHeight] + [APNTaskListCell increasedHeightWithName:module.apnTaskName];
        }
        return module.totalHeight;
    }
    複製程式碼

    有了 ({}) 後你可以使用三目運算子來省略 if 判斷,如下

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        APNTaskListModel *module = _data[indexPath.row];
        return module.totalHeight > 1.0 ? module.totalHeight : ({
            module.totalHeight = [APNTaskListCell defaultHeight] + [APNTaskListCell increasedHeightWithName:module.apnTaskName];
            module.totalHeight;
        });
    }
    複製程式碼

    再來一個?

    model.showRightArrow ? ({
        // 這裡也可以封裝為函式
        self.rightArrowImgView.hidden = NO;
        self.rightArrowImgView.image = model.rightArrowIcon;
        self.spaceForDetail.constant = 33;
    }) : ({
        self.rightArrowImgView.hidden = YES;
        self.spaceForDetail.constant = 15;
    });	
    複製程式碼

    emmm... 下一個.

  3. 在自定義巨集函式中的使用:

    一般我們會在專案中自定義一些巨集,在區分 debug 模式和 release 模式,如下一個簡單的例子:

    #ifdef DEBUG
    #define DR_SimpleLog(...) NSLog(__VA_ARGS__)
    #else
    #define DR_SimpleLog(...)
    #endif
    複製程式碼

    當我們在使用時可能會碰到一種情況,我想要在debug模式下看到某個計算方法被呼叫的次數時,可能會出現如下程式碼:

    static NSInteger i = 0;
    DR_SimpleLog(@"計算了:%@次",@(++i));
    複製程式碼

    但是這個 static 變數 i ,我們不想讓它在 release 模式下存在,so:

    DR_SimpleLog(@"計算了:%@次",({
        static NSInteger i = 0;
        @(++i);
    }));
    複製程式碼

相關文章