このトリックを見つけた同様の質問にリンクしてくれた@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のドキュメントでこれを見つけました:
NSError を生成する Objective-C メソッド宣言でマクロを使用してNS_SWIFT_NOTHROW
、スローするメソッドとして 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
)、最適ではありませんが、私が見つけることができる最高のものです。