2017-11-10 103 views
0

我在Objective C中有一个函数,它返回一个BOOL并且有一个errorOut参数。雨燕桥转换errorOut参数为throws如预期,但它也停止返回的BOOLSwift error:无法将类型'()throws - >()'的值转换为指定类型'Bool'

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

目标C函数签名

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

不是https://stackoverflow.com/questions/45565960/ns-refined-for-swift-and-return-value的重复,因为虽然答案会引导您找到正确的解决方案,但问题是不同的。 此外,绝对不是重复的https://stackoverflow.com/questions/35810651/swift-error-cannot-convert-of-type-to-specified-type-bool – Inti

+0

这就是重复的意思。他的回答是一样的。不是说问题是相同的。 – Dijkgraaf

回答

0

感谢@MartinR链接到一个similar question,我发现这招:

改造客观C函数声明

- (BOOL)hasAnyData:(NSError *__autoreleasing *)errorOut __attribute__((swift_error(nonnull_error))); 

然后从斯威夫特调用它像

let hasAnyData: Bool = try self.repo.hasAnyThings() 

不正是我想要的!

swift_error属性被记录在这里:https://github.com/apple/swift-clang/blob/383859a9c4b964af3d127b5cc8abd0a8f11dd164/include/clang/Basic/AttrDocs.td#L1800-L1819


原来的答复 - 没有完全解决问题,但可能是别人在这个问题看,因为它是在类似情况下有用有用。

我终于发现了这个在斯威夫特文档:

Use the NS_SWIFT_NOTHROW macro on an Objective-C method declaration that produces an NSError to prevent it from being imported by Swift as a method that throws.

我现在已经添加了一个NS_SWIFT_NOTHROW注释到我的目标C函数的声明像

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

时遇到的NSError pointer通过从斯威夫特

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

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

+1

'__attribute __((swift_error(nonnull_error)))'应该是你需要的,比较https://stackoverflow.com/a/45566261/1187415。 –

+0

这看起来像正是我需要的 - 我会测试它并相应更新我的答案。感谢@MartinR – Inti

相关问题