使用NSError参数在swfit中实现Objective-C协议

时间:2018-12-17 08:19:02

标签: objective-c swift protocols

我想在本机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];
                    }
                }

我希望我的问题有一点清楚。你知道我该怎么解决吗?

0 个答案:

没有答案