Я хотел бы использовать автономную среду синхронизации данных Microsoft в собственном проекте iOS.Эта основа написана в 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.Но в swift тип возвращаемого значения не может быть нулевым из-за определения метода.В этом случае он должен выдать ошибку, но я должен вернуть ноль, потому что фреймворк не обрабатывает никаких ошибок.
Мой вопрос: как я могу реализовать этот протокол, чтобы этот метод возвращал ноль, а не выбрасывал ошибку?
ОБНОВЛЕНИЕ
Я знаю, что это не лучшее решение, которое я ищу, поэтому я и спросил.Я собираюсь добавить больше деталей.
Итак, есть протокол, о котором я упоминал выше.В инфраструктуре MS objc есть класс, который вызывает мой swift-класс, который реализует этот протокол.Этот метод должен получить строку из локальной базы данных по ее идентификатору.Согласно исходной реализации MS objc этот метод возвращает nil, если он не находит ни одной строки по идентификатору, и устанавливает сообщение об ошибке в параметре orError, и, таким образом, оригинальный код - то, что назвал этот метод - может выполняться дальше.Но когда класс MS вызывает мой класс, я не могу вернуть ноль из-за моей быстрой реализации.Я должен выдать ошибку, если я не нашел строку по идентификатору, но в этом случае освобождение метода вызывается из-за ошибки - но в соответствии с исходным кодом 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];
}
}
Я надеюсь, что моя проблема немного прояснилась.У вас есть идеи, как мне это решить?