Ошибка Swift: невозможно преобразовать значение типа '() throws -> ()' в указанный тип 'Bool'

У меня есть функция в Objective C, которая возвращает BOOL и имеет один errorOut параметр. Быстрый мост преобразует errorOut параметр в throws как и ожидалось, но это также останавливает BOOL возвращается

Я вижу, что обычно BOOL возвращается для обозначения успеха / ошибки, но в этом случае bool действительно требуется. Какие изменения мне нужно сделать, чтобы убедиться, что bool возвращается?

Сигнатура целевой функции C

- (BOOL)hasAnyData:(NSError *__autoreleasing *)errorOut;

1 ответ

Решение

Спасибо @MartinR за ссылку на похожий вопрос, где я нашел этот трюк:

Изменение объявления функции Objective C на

- (BOOL)hasAnyData:(NSError *__autoreleasing *)errorOut __attribute__((swift_error(nonnull_error)));

А потом звонить со Свифта как

let hasAnyData: Bool = try self.repo.hasAnyThings()

Делает именно то, что я хотел!

swift_error Атрибут задокументирован здесь: https://github.com/apple/swift-clang/blob/383859a9c4b964af3d127b5cc8abd0a8f11dd164/include/clang/Basic/AttrDocs.td#L1800-L1819


Оригинальный ответ - не полностью решает проблему, но может быть полезен для кого-то еще, смотрящего на этот вопрос, поскольку это полезно в подобной ситуации.

Я наконец нашел это в документах Swift:

Использовать NS_SWIFT_NOTHROW макрос в объявлении метода Objective C, который генерирует NSError, чтобы предотвратить его импорт Swift как метод, который выдает.

Я сейчас добавил NS_SWIFT_NOTHROW аннотации к моему объявлению функции Objective C, как

- (BOOL)hasAnyData:(NSError *__autoreleasing *)errorOut NS_SWIFT_NOTHROW;

И я должен пройти в NSError pointer от Свифта

var error: NSError?
let hasAnyData = self.repo.hasAnyData(&error)

Это не самое лучшее, потому что я больше не могу быстро обработать ошибку (используя do, try catch и вместо этого придется использовать NSError) но это лучшее что я смог найти.

Другие вопросы по тегам