Objective-C声明全局可抛出Swift函数时NSError转throws遇阻求助
解决Objective-C函数映射Swift throws的问题
我之前也踩过类似的坑,咱们一步步来排查和修复:
首先你的函数声明里有个核心问题——NSError ** error没有标记为_Nonnull,而swift_error(nonnull_error)这个属性要求error参数本身必须是非空的(也就是调用者必须传入一个有效的NSError指针地址,不能传NULL),这是Swift能把它映射成throws语法的关键前提。
另外,你的返回值是_Nullable NSString *,如果这个函数在成功时一定会返回有效的字符串,建议把它改成_Nonnull,这样Swift里的返回类型就是非可选的String,更符合throws函数的常规设计逻辑(错误通过抛出传递,成功就返回确定的结果)。
修改后的Objective-C函数声明
NSString * _Nonnull revHashOfFile(NSURL * _Nonnull url, NSError ** _Nonnull error) __attribute__((swift_error(nonnull_error), swift_name("revHash(ofFile:)")));
还要注意这几个细节:
- 桥接文件配置:确保包含这个函数声明的头文件已经添加到项目的桥接文件(比如
YourProject-Bridging-Header.h)里,不然Swift根本识别不到这个函数。 - 函数实现规范:严格遵循Obj-C的error模式编写实现:
- 成功时:返回有效的字符串,同时把
*error设为NULL - 失败时:返回
nil(如果返回值保留nullable的话),并给*error赋值一个合法的NSError对象
- 成功时:返回有效的字符串,同时把
- 清理缓存重新编译:有时候Xcode的旧缓存会导致生成的Swift接口不符合预期,试试
Product > Clean Build Folder后重新编译项目。
修改完成后,Swift里应该就能看到你预期的接口了:
public func revHash(ofFile url: URL) throws -> String
调用时就可以用标准的do-catch语法处理错误:
let fileURL = URL(fileURLWithPath: "/path/to/your/file") do { let hash = try revHash(ofFile: fileURL) print("计算得到的哈希值:\(hash)") } catch { print("出错了:\(error.localizedDescription)") }
内容的提问来源于stack exchange,提问作者Linus Unnebäck
相关产品推荐
相关产品推荐

