Swift error:无法将类型'()throws - >()'的值转换为指定类型'Bool'
我在Objective C中有一个函数,它返回一个BOOL
并且有一个errorOut
参数。雨燕桥转换errorOut
参数为throws
如预期,但它也停止返回的BOOL
。Swift error:无法将类型'()throws - >()'的值转换为指定类型'Bool'
我可以看到,通常BOOL
返回指示成功/错误,但在这种情况下,布尔实际上是想要的。我需要做些什么改变才能确保布尔被返回?
目标C函数签名
- (BOOL)hasAnyData:(NSError *__autoreleasing *)errorOut;
感谢@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
),但它是我能找到的最好。
'__attribute __((swift_error(nonnull_error)))'应该是你需要的,比较https://*.com/a/45566261/1187415。 –
这看起来像正是我需要的 - 我会测试它并相应更新我的答案。感谢@MartinR – Inti
不是https://*.com/questions/45565960/ns-refined-for-swift-and-return-value的重复,因为虽然答案会引导您找到正确的解决方案,但问题是不同的。 此外,绝对不是重复的https://*.com/questions/35810651/swift-error-cannot-convert-of-type-to-specified-type-bool – Inti
这就是重复的意思。他的回答是一样的。不是说问题是相同的。 – Dijkgraaf