我在Objective C中有一个返回BOOL
并且有一个errorOut
参数的函数。 swift网桥按预期将errorOut
参数转换为throws
,但它也会停止返回BOOL
。
我可以看到通常返回BOOL
表示成功/错误但在这种情况下实际上需要bool。我需要做些什么改变才能确保bool返回?
目标C函数签名
- (BOOL)hasAnyData:(NSError *__autoreleasing *)errorOut;
答案 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
),但它是最好的我能找到。