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

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

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

Сигнатура функции Objective C

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

person Inti    schedule 10.11.2017    source источник
comment
Не дубликат stackoverflow.com /questions/45565960/ хотя ответ и ведет вас к правильному решению, вопрос отличается. Кроме того, определенно не дубликат stackoverflow.com/questions/35810651/   -  person Inti    schedule 11.11.2017
comment
Вот что значит дубликат. Что он отвечает то же самое. Не то, чтобы вопрос был идентичным.   -  person Dijkgraaf    schedule 11.11.2017


Ответы (1)


Спасибо @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
comment
__attribute__((swift_error(nonnull_error))) должен быть тем, что вам нужно, сравните stackoverflow.com/a/45566261/1187415. - person Martin R; 11.11.2017
comment
Похоже, это именно то, что мне нужно - я проверю это и соответствующим образом обновлю свой ответ. Спасибо @MartinR - person Inti; 11.11.2017