Swift错误:无法转换类型'()的值抛出 - > ()'指定类型' Bool'

时间:2017-11-10 21:34:59

标签: objective-c swift objective-c-swift-bridge

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

我可以看到通常返回BOOL表示成功/错误但在这种情况下实际上需要bool。我需要做些什么改变才能确保bool返回?

目标C函数签名

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

1 个答案:

答案 0 :(得分:0)

感谢@MartinR链接到similar question我找到了这个技巧:

将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文档中找到了这个:

  

在Objective-C方法声明中使用NS_SWIFT_NOTHROW宏   产生NSError以防止它被Swift导入   抛出的方法。

我现在已经为我的Objective C函数声明添加了NS_SWIFT_NOTHROW注释,如

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

我必须从Swift传递NSError pointer

var error: NSError?
let hasAnyData = self.repo.hasAnyData(&error)

这不是最好的,因为我不能再以一种很快的方式处理错误(使用do, try catch而是必须使用NSError),但它是最好的我能找到。