0

を返し、BOOL単一のerrorOutパラメーターを持つ Objective C の関数があります。迅速なブリッジは、errorOutパラメーターを期待どおりに変換しますが、返されるthrowsことも停止します。BOOL

通常、成功/エラーを示すために が返されることがわかりBOOLますが、この場合は bool が実際に必要です。bool が確実に返されるようにするには、どのような変更を加える必要がありますか?

Objective C 関数のシグネチャ

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

1 に答える 1

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のドキュメントでこれを見つけました:

NSError を生成する Objective-C メソッド宣言でマクロを使用してNS_SWIFT_NOTHROW、スローするメソッドとして Swift によってインポートされるのを防ぎます。

NS_SWIFT_NOTHROWObjective 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)、最適ではありませんが、私が見つけることができる最高のものです。

于 2017-11-10T21:34:58.507 に答える