0

我在 Objective C 中有一个函数,它返回 aBOOL并且有一个errorOut参数。swift 桥将errorOut参数转换throws为预期的参数,但它也停止BOOL返回。

我可以看到通常BOOL返回以指示成功/错误,但在这种情况下实际上需要 bool。我需要进行哪些更改以确保返回布尔值?

目标 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_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),但这是我能找到的最好的。

于 2017-11-10T21:34:58.507 回答