Спасибо @MartinR за ссылку на похожий вопрос, где я нашел этот трюк:
Изменение объявления функции Objective C на
- (BOOL)hasAnyData:(NSError *__autoreleasing *)errorOut __attribute__((swift_error(nonnull_error)));
А затем вызовите его из Swift, например
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
от Swift
var error: NSError?
let hasAnyData = self.repo.hasAnyData(&error)
Это не самое приятное, потому что я больше не могу быстро обрабатывать ошибку (используя do, try catch
и вместо этого должен использовать NSError
), но это лучшее, что я мог найти.
person
Inti
schedule
10.11.2017