我想在本机iOS项目中使用Microsoft的离线数据同步框架。这个框架是用Objective-C编写的,但是我使用的是Swift。我实现了自己的本地数据存储,因此必须实现框架中的协议。协议中有一种方法类似于以下方式:
-(nullable NSDictionary *) readTable:(nonnull NSString *)table
withItemId:(nonnull NSString *)itemId
orError:(NSError * __nullable * __nullable)error;
实施协议时,我很快就知道了:
func readTable(_ table: String, withItemId itemId: String) throws -> [AnyHashable: Any] {
fatalError("readTable(table:itemId:) has not been implemented")
}
问题在于返回类型由于orError参数而不能为空。在obc中,这是很好的,因为如果方法中有错误,则orError参数不会为null,并且该方法的返回类型可以为nil。但是由于方法的定义,返回类型不能很快为零。在这种情况下,它应该引发错误,但是我必须返回nil,因为框架不会处理任何错误。
我的问题是如何实现此协议,以便此方法返回nil而不是抛出错误?
更新
我知道这不是最好的解决方案,这就是我问的原因。我将添加更多详细信息。
所以这里有我上面提到的协议。在objc MS框架中,有一个类称为我的swift类,它实现了该协议。此方法必须通过其ID从本地数据库中检索一行。根据原始的objc MS实现,如果该方法未按ID查找到任何行,则返回nil,并在orError参数中设置错误消息,因此原始代码(称为此方法)可以继续运行。但是当MS类调用我的类时,由于我的快速实现,我无法返回nil。如果找不到ID所对应的行,则必须抛出一个错误,但是在这种情况下,由于错误,调用方方法的执行将被卡住-但根据原始objc代码,它应继续运行而不会出现错误。这是调用方类的代码片段:
// Check to see if this item already exists
NSString *itemId = itemToSave[MSSystemColumnId];
NSDictionary *result = [self.dataSource readTable:table withItemId:itemId orError:&error];
if (error == nil) {
if (result == nil) {
[self.dataSource upsertItems:@[itemToSave] table:table orError:&error];
} else {
error = [self errorWithDescription:@"This item already exists."
andErrorCode:MSSyncTableInvalidAction];
}
}
我希望我的问题有一点清楚。你知道我该怎么解决吗?