iOS使用协议解决重用界面时模型的不兼容
2016-12-15 本文已影响65人
Fsn_soul
如果工程项目换了几波人接手开发,那么就有可能出现一种现象:
某个控制器是用classA模型的数据显示的,如果其他人想复用这个控制器,那么必须就得传入classA模型,但是其他人定义的是classB模型,或者classC模型数据(虽然这些模型表示的意思是一样的但属性名各不相同).这时一般的做法就是把classB或classC模型的数据一个个赋值给新创建的classA模型.如果这个控制器复用率挺高的话就会产生一堆这样的赋值代码,当然你也可以在classB模型中提供一个转换为classA模型的方法.
不过今天要讲的是通过定义一个协议来实现这一需求,
具体思路如下:
1.首先定义一个协议,在这个协议里定义一些属性,这些属性将是控制器数据的来源.
2.其他模型遵循这个协议,并实现这些属性的setter/getter方法.
3.在控制器里面使用遵守该协议的模型.这样控制器使用的其实已经不是一个具体某个类的模型了.
代码如下:
@protocol ModelProtocl <NSObject>
@optional
@property (nonatomic, copy) NSString *carId;
@property (nonatomic, copy) NSString *carName;
@property (nonatomic, copy) NSString *carLogo;
@end
@interface XQViewController : UIViewController
@property (nonatomic, strong) NSMutableArray<id<ModelProtocl>> *datas;
@end
@implementation XQViewController
- cellForRow…{
id<ModelProtocl> model = self.datas[indexPath.row];
//使用该model配置cell
cell.textLabel.text = model.carName;
…
}
@end
@interface classB : NSObject<ModelProtocl>
@property (nonatomic, copy) NSString *pNameA;
@property (nonatomic, copy) NSString *pNameB;
@property (nonatomic, copy) NSString *pNameC;
@property (nonatomic, copy) NSString *pNameD;
@property (nonatomic, copy) NSString *pNameE;
@end
@implementation classB
-(NSString *)carId{
return self.pNameA;
}
-(NSString *)carName{
return self.pNameB;
}
-(NSString *)carLogo{
return self.pNameC;
}
@end
这样做比在classB模型中提供一个转换为classA模型的方法有什么优势呢?
优势就是你不需要查看到底需要赋值哪些属性,可能classA模型里还有很多不相关的属性,减少出错的可能.
如果你的项目中也因为数据模型的不同而导致复用某个UI时写一堆恶心的模型转换代码,或许你可以尝试一下.