最近在用同事的库做二次开发,新的工程是打算用Swift来写,结果我发在处理一个数据的回调的时候,只要去读一下那个数据就会出错。我一度怀疑我可能学的假Swift了,怎么处理个普通的delegate回调都不行了呢?!
当我对数据进行追踪的时候,我发现错误来自于库里面,它通过一个回调,回调了不同的数据内容,导致我在读的时候,出现数据类型不匹配的错误,具体如下:
@protocol ManagerDelegate <NSObject>
@optional
/**
@param array 设备数组
@param status 状态
*/
-(void)onManagerPeripherals:(NSArray<Entity*> *)array
updateStatus:(BLEStatus)status;
/////////////////////////////////////////////
这里使用的是一种可选的回调,主要想用来回调数组内容为Entity的数据内容
然后我进入回调内容那里一看,事情大条了
-(void)notePeripheralChanged:(NSNotification*)note{
NSString *name = note.name;
NSArray *peripherals = [NSArray new];
BLEStatus status = BLEStatusUnknown;
//分别处理不同命令
if ([name isEqual:kUI_BLE_FOUND])
{
status = JL_BLEStatusFound;
peripherals = note.object; // 这里传回来的是一组[Entity] 内容
}
else if ([name isEqual:kUI_BLE_PAIRED])
{
status = BLEStatusPaired;
Entity *entity = note.object;
if (entity) peripherals = @[entity.mPeripheral]; // 但是这里的不是!!!!
}
if ([_managerDelegate respondsToSelector:@selector(onManagerPeripherals:updateStatus:)]) {
[_managerDelegate onManagerPeripherals:peripherals updateStatus:status];
}
}
这样的回调在Objective-c中是没有问题的,只要针对不同的Status来对应读取内容就可以了,但是这样的写法在Swift中却是非常致命的。
由此可见Swift的严谨性还是高于Objective-c的。
而且,我个人也非常不建议使用这样的写法,这样会导致在外面调用这些方法的人难以理解回调的数据类型。
在平时我们使用这种回调方法的时候,要么就不确定类型,让尽可能多的数据从一个接口回调到上层,再分流。要么就制定只回调一种类型的数据,那样才能写出优秀的代码。
网友评论