Ошибка 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
) но это лучшее что я смог найти.