感谢@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
),但它是我能找到的最好。
不是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
这就是重复的意思。他的回答是一样的。不是说问题是相同的。 – Dijkgraaf