我在 Objective C 中有一个函数,它返回 aBOOL
并且有一个errorOut
参数。swift 桥将errorOut
参数转换throws
为预期的参数,但它也停止BOOL
返回。
我可以看到通常BOOL
返回以指示成功/错误,但在这种情况下实际上需要 bool。我需要进行哪些更改以确保返回布尔值?
目标 C 函数签名
- (BOOL)hasAnyData:(NSError *__autoreleasing *)errorOut;
我在 Objective C 中有一个函数,它返回 aBOOL
并且有一个errorOut
参数。swift 桥将errorOut
参数转换throws
为预期的参数,但它也停止BOOL
返回。
我可以看到通常BOOL
返回以指示成功/错误,但在这种情况下实际上需要 bool。我需要进行哪些更改以确保返回布尔值?
目标 C 函数签名
- (BOOL)hasAnyData:(NSError *__autoreleasing *)errorOut;
感谢@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
),但这是我能找到的最好的。