合理优化解决if、else的问题

2019-12-26  本文已影响0人  WY_260f

用魔法数字的缺点

无意义,0、1这样的数字只能表示位置。没有其它的信息。

容易出错,在cell代理方法,高度代理方法,点击代理方法里面要保持一致,容易出错。

不方便修改,如果要修改两个cell的顺序,要修改好几个地方。

下面说一下解决方法,并不是什么高深的东西,有一定开发经验的人应该都懂。对于一个tableview,位置数字肯定是有的,我们要消除数字,那就得找到相应的数据来代替它。这里,主要的场景一般都是一个row对应一种类型的cell,所以类型是固定的,所以我们用一个枚举来定义所有类型的cell。

typedef NS_ENUM(NSInteger, InvestCellType) {

    HomeCellTypeOfficial =0,

    HomeCellTypeWechat,

    HomeCellTypeAlipay,

};

上面是我从项目里直接复制出来的,请忽略名字(取名真是一个痛苦的事【抱头】)。列表的数据一般都是放在一个Array里面,还是以我上面的例子来说明,我有6种类型的model,有些model可能有多个,像上面枚举里面最后那个类型的model就可能有多个。从服务器拉回数据后,我就在vm里面解析好,全放到一个array里面了,就是列表的数据源。下面是我的cellForRow方法:

switch ([self getHomeCellType]) {

        case HomeCellTypeOfficial:{

            InvestOfficialCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"official" forIndexPath:indexPath];

            return cell;

            break;

        }

        case HomeCellTypeWechat:{

            InvestWechatCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"wechat" forIndexPath:indexPath];

            return cell;

            break;

        }

        case HomeCellTypeAlipay:{

            InvestAlipayCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"alipay" forIndexPath:indexPath];

            return cell;

            break;

        }

        default:

            break;

    }

这样的cellForRow方法是不是很简洁。里面的getHomeCellType方法是通过dataArray里面model的类型,拿到对应的cell类型。方法如下:

- (InvestCellType)getHomeCellType {

    InvestCellType type = HomeCellTypeOfficial;

    switch (self.selectIndex) {

        case 0:

            type = HomeCellTypeOfficial;

            break;

         case 1:

            type = HomeCellTypeWechat;

            break;

        case 2:

            type = HomeCellTypeAlipay;

            break;

        default:

            break;

    }

    return type;

}

不是公共代码我们一般不加项目前缀,有点多余的感觉。

上一篇 下一篇

猜你喜欢

热点阅读